【问题标题】:delegates and protocols objective代表和协议目标
【发布时间】:2012-05-07 04:08:32
【问题描述】:

我想澄清目标 c 中委托和协议的概念。 所以有两种类型的协议 1)正式 2)非正式的

在正式委托的情况下.. 如果该人已经定义了协议方法但没有在两者中实际实现它怎么办。即 B 类是 A 的委托,A 具有方法 WindowDidMove 作为可选...在这种情况下。会有什么行为???是否必须在 b 类中实现委托功能。我不能只在A中实现它并在我想要的任何地方使用它......相反,不要在A中定义它,并在B或C类或D类中给出单独的实现并使用它们但是我想要......请澄清这一点– @class A;

@protocol ADelegate <NSObject>
@optional

- (BOOL)A:(A *)foo doSumfin:(BOOL)decide;

@end

@interface A : NSObject {
NSString *bar;
id <ADelegate> delegate;
}

@property (nonatomic, retain) NSString *bar;

@property (nonatomic, assign) id <ADelegate> delegate;

- (void)someAction;

@end

还有,那一行是什么

id  <A Delegate > delegate; 

@property (nonatomic, assign) id <ADelegate> delegate;

帮助我们实现..

在非正式协议的情况下...如果我不提供方法的实现并仍然调用委托方法...会发生什么。?

【问题讨论】:

    标签: objective-c xcode delegates protocols concept


    【解决方案1】:

    如果您调用了您的委托未实现的委托方法,这将导致异常。对于可选的委托方法,您通常会通过首先检查委托是否响应来检查委托是否实现它们:

    if ([self.delegate respondsToSelector:@selector(someDelegateMethod:)]) {
        [self.delegate someDelegateMethod:self];
    }
    

    这不会因非正式协议而发生任何变化。不要将非正式协议与可选协议方法混淆。非正式协议通常只是 NSObject 类别,不应再使用。

    【讨论】:

    • 请编辑答案以解释场景 2...在正式协议的情况下.. 如果我为不同类中的单个可选方法提供单独的实现,如果我给出会发生什么协议类中的实现,并希望在其他任何地方使用它。也请清除这一点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    相关资源
    最近更新 更多