iOS5.0之前声明@property的写法
- 老代码中声明一个@property的过程:
@interface ViewController ()
{
// 1.声明成员变量
NSString *varStr;
}
//2.在用@property
@property(nonatomic, copy) NSString *varStr;
@end
@implementation ViewController
//3.在@implementation中用synthesize生成setter方法
@synthesize varStr; //合成方法的意思
@end
声明一个属性非常繁琐,后来 Apple
弃用gcc编译器,使用LLVM编译器(low level virtual machine),才不再需要为属性声明实例变量了。
如果我们不需要系统自动生成setter和getter方法可以使用@dynamic修饰词,这时就需要手动生成。
- 采用LLVM编译器后声明@property:
1.自动生成 _xxx变量
2.自动生成 _seter和getter方法。
self.var,_var,self->_var声明语义
self->_var:这个和C++的作用一样访问_var变量,这样访问不会调用setter和getter方法
self.var:这个就要区分是取值还是赋值了
如果是赋值: self.var = xxxxx,此操作会调用setter方法。
如果是取值: id xxxxx = self.var 此操作会调用getter方法。
_var:这种调用也是直接取值,不会和调用setter和getter方法
。与self->_var写法等效。
总结
在实际运用中,可能由于对属性语法的不了解,在setter和getter方法中明明声明了逻辑,却没有执行。举个例子:
我们在getter方法中声明了懒加载的代码:
@interface ViewController ()
@property(nonatomic, copy) NSString *varStr;
@end
@implementation ViewController
- (NSString *)varStr {
_varStr.xxx = xxxx
_varStr.xxx = xxxx
return _varStr;
}
- (void)viewDidLoad{
_varStr = [[NSString alloc] init]//这样调用悲剧就出现了,_varStr 是不会触发getter方法的
}
@end
在运用懒加载的时候,没有调用self.xxx = xxx,而是调用的_varStr = xxx。这样就不会调用getter方法。希望可以解决大家在声明属性书写不规范导致的隐患问题。
网友评论