Objective-C init方法的正确语法

ecl*_*lux 20 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;
}

...
Run Code Online (Sandbox Code Playgroud)

Bar*_*ark 26

Objective-C中的对象实例变量nil默认初始化为.此外,nil允许消息传递(与null在Java,C#或C++等函数调用语言中调用方法不同).消息的结果nilnil,这个调用[nil release];只是nil,而不是例外.

另外,最佳做法是直接在-init-dealloc方法中分配/调用实例变量:

-(id)init {
    if ( self = [super init] ) {
        myArray = nil;
    }
    return self;
}

- (void)dealloc {
    [myArray release];
    [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)


pau*_*ley 13

正如其他人所说,实例变量已初始化为nil.

另外,根据Apple的文档,实例变量应该直接在init方法中设置,因为类(或其子类)的getter/setter方法可能依赖于完全初始化的实例.