【发布时间】:2014-05-14 16:04:50
【问题描述】:
我有一个符合协议的具有delegate 属性的类:
MyClass.h
@interface MyClass : NSObject
@property (nonatomic, weak) id<MyProtocol> delegate;
@end
我想为delegate 属性设置一个默认值,就像UITableViewController 所做的那样。
考虑以下几点:
MyClass.m
@interface MyClass ()
@property (nonatomic, strong) id<MyProtocol> defaultDelegate;
@end
@implementation MyClass
- (instancetype)init
{
self = [super init];
if (self) {
_defaultDelegate = // something conforming to MyProtocol
_delegate = _defaultDelegate;
}
return self;
}
@end
这种方法有什么问题吗,或者可以以任何方式改进吗?
更新 #1
接下来呢?
该属性不称为delegate,而是类似于colorPalette 或fontFamilies,需要一个默认值。
协议中的所有内容都是@required。
在运行时,属性的值可以设置为其他值(符合协议的另一个类的实例)。
更新 #2
我正在尝试封装(默认)行为。
考虑到有 3 个类符合协议 - 最初我可能想使用第一个类中的所有值。明天我可能会选择第二个更好的默认值。此外,用户可以在运行时设置一个偏好,它可以使用 3 个中的任何一个。
【问题讨论】:
-
nil因为向nil发送消息是nop -
另外,约定是委托的默认值应该是零。因此,无论您在哪里调用委托上的方法,都要确保它的行为正常。
-
如果设置委托值不是可选的,只需断言协议值为 nil。
-
委托通常是弱(分配)引用和“不”强(保留)。它的默认值为 nil。您可以在没有设置委托的地方实现逻辑。
标签: objective-c automatic-ref-counting delegation