假设我有以下课程
@interface
@property ( nonatomic, retain ) MyObject* property;
@end
@implementation
@synthesize property = _property;
-(id) init{
if ((self = [super init])) {
_property = [MyObject new];
self.property = [MyObject new];
NSLog(@"%@", _property.description);
NSLog(@"%@", self.property.description);
}
return self;
}
@end
正确的方法是什么?使用访问器(合成:self.property)或直接使用ivar?只是当我尝试在其他文件中使用它时,我有时会觉得使用访问器会导致错误。
答案 0 :(得分:5)
要么是好的。使用self.property
调用getter或setter方法(合成或定义),而_property
直接访问实例变量。
由于self.property
调用方法,因此可能会产生副作用。例如:
- (Property *)property {
if (_property == nil) {
_property = [[Property alloc] init];
}
return _property;
}
调用self.property
将创建一个新属性,如果在返回该值之前它不存在,则将其分配给_property
,而_property
如果在self.property
之前访问它将指向n {第一次在此类的特定实例上调用{1}}。
实际上,@property
声明不必与实例变量对应; -property
方法的实现可以在每次调用时创建并返回一个新属性。