当合成的setter尝试释放未定义的myArray对象时,为什么这个公共属性初始化方案没有风险失败?或者属性对象是否自动初始化为nil,我根本不需要这样做?
@interface myClass : NSObject {
NSArray* myArray;
}
@property (nonatomic, retain) NSArray* myArray;
@end
@implementation myClass
@synthesize myArray;
-(id)init {
if ( self = [super init] ) {
self.myArray = nil;
}
return self;
}
...
答案 0 :(得分:26)
默认情况下,Objective-C中的对象实例变量初始化为nil
。此外,允许使用消息传递nil
(与在函数调用语言(如Java,C#或C ++)中调用null
上的方法不同)。 nil
邮件的结果为nil
,此调用[nil release];
仅为nil
,不是例外。
另一方面,最佳做法是直接在-init
和-dealloc
方法中分配/调用实例变量:
-(id)init {
if ( self = [super init] ) {
myArray = nil;
}
return self;
}
- (void)dealloc {
[myArray release];
[super dealloc];
}
答案 1 :(得分:13)
正如其他人所说,实例变量已初始化为nil
。
此外,as per Apple's documentation,实例变量应该直接在init
方法中设置,因为类(或其子类)的getter / setter方法可能依赖于完全初始化的实例。
答案 2 :(得分:3)
它已初始化为nil
。