要在一个类本身内触发合成存取器,您必须使用self
。如果您不这样做,则直接绕过访问器方法访问该属性的地址。你需要:
NSString *abc = @"Hardik";
[self.array addobject:abc];
NSLog(@"array = %@", self.array);
这个很重要的原因是合成的方法通常也会初始化属性。该合成方法阵列的内部看起来是这样的:
-(NSArray *) array{
if (array!=nil) {
return array;
}
array=[[NSMutableArray alloc] initWithCapacity:1];
return array;
}
self.propertyName
实际上只是[self propertyName]
和self.propertyName=someValue
速记仅仅是[self setPropertyName:someValue]
简写。
,直到调用self.array
至少一次,数组属性没有初始化。
但是,只是为了混淆事情,一旦您初始化后调用了self.array
,那么您可以直接调用array
。所以...
[self.array addObject:abc];
NSLog(@"array = %@", array);
...工作,而逆向会返回一个空的数组。
所以规则是:
- 在一个类实现 (包括子类),称只是
propertyName
给你的财产的地址 但不调用 的的getter/setter存取方法。
- 在一个类实现 (包括子类),使用
self.propertyName
调用 的getter/setter存取方法,但 不直接访问属性。
- 来自课外 的实现例如
myClass.propertyName
调用 getter/setter访问器方法。