之前一直搞不懂,现在也是看了一些博客,写下来自己的总结.
@interface ViewController : UIViewController
@property (nonatomic,copy)NSString *str;
@end
系统会自动帮我们生成一个实例变量_str,以及str的setter和getter
需要注意的是:
使用self.str会调用getter方法,但是调用_str是不会调用getter方法的
如果我们声明了一个名为text的字符串
@interface ViewController : UIViewController
{
NSString *text;
}
@property (nonatomic,copy)NSString *str;
@end
需要注意的是我们在使用的时候当使用self.text会报错:
报错的原因就在于:oc中的点语法标识调用的是方法(setter或者getter方法),但是我们没有生成此方法
综上所述:
当我们直接用@property声明一个属性的时候,编译器会自动帮我们生成一个带有下划线的实例变量,并会自动帮你生成setter和getter方法
PS:
在这里需要注意的是@synthesize的使用,它除了帮我们生成对应的setter和getter之外,还可以帮我们重新指定属性对应的实例变量
例如:
@synthesize str = _text;
self.str = @"123";
NSLog(@"%@",self.str);
NSLog(@"%@",_text);
_text = @"456";
NSLog(@"%@",self.str);
NSLog(@"%@",_text);
2018-12-28 10:03:26.963868+0800 TestDemo[11149:121008] 123
2018-12-28 10:03:26.963972+0800 TestDemo[11149:121008] 123
2018-12-28 10:03:26.964058+0800 TestDemo[11149:121008] 456
2018-12-28 10:03:26.964124+0800 TestDemo[11149:121008] 456
当我们重新指定了之后,就没办法像之前那样调用_str了.
@synthesize 还可以帮我们重新指定生成的实例变量名称:
@property (nonatomic,copy)NSString *name;
@synthesize name
当使用@synthesize name的时候,属性name生成的实例变量的名字不再是_name,而是name了.与此同时访问的方法也变成了:
self.name = @"123";
NSLog(@"%@",self.name);
NSLog(@"%@",name);
2018-12-28 10:19:39.420046+0800 TestDemo[11337:146194] 123
2018-12-28 10:19:39.420145+0800 TestDemo[11337:146194] 123