Objective-C init方法的正确语法

时间:2010-11-12 14:57:43

标签: iphone objective-c ios

当合成的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;
}

...

3 个答案:

答案 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