跳过成员变量的"self"关键字会导致程序崩溃

1 iphone cocoa-touch objective-c ios

在下面的代码中:

- (void)viewDidLoad {

    NSArray *array = [[NSArray alloc] initWithObjects: @"Browny", @"Andy", @"Chiki", @"Gillu",
                      @"SnowLeopard", @"Lion", @"Tiger", @"SiberianTiger", nil ];
    self.pickerData = array;
    [array release];    

}
Run Code Online (Sandbox Code Playgroud)

如果我在上面self.pickerData改为pickerData,程序会崩溃EXC_BAD_ACCESS signal received.

我想对于使用关键字的对象的成员变量/属性self是可选的吗?任何提示,为什么我需要self这里,即使pickerData是类的成员变量?

Pau*_*l.s 5

将其包装在一个答案中,而不是点缀其他答案.

你打电话的时候

self.pickerData = array; 
Run Code Online (Sandbox Code Playgroud)

这是编译为

[self setPickerData:array];
Run Code Online (Sandbox Code Playgroud)

如果您@sythesize pickerData的实现将执行类似于以下操作:

- (void)setPickerData:(NSArray *)_pickerData;
{
    if (pickerData != _pickerData) {
        [pickerData release];
        pickerData = [_pickerData retain];
    }
}
Run Code Online (Sandbox Code Playgroud)

所以区别在于,self.pickerData = array将通过将执行正确内存管理的setter,而pickerData = array直接分配值.