iOS Objective-C为什么属性(property)同时
问题
在开发当中,遇到定义了一个属性,需要同时重构它的setter、getter方法,有的时候会报错,上代码:
@interface SetterGetterClass : NSObject
@property(nonatomic,strong)NSString *developername;
@end
这个是声明的属性,下面是实现setter、getter方法以后报错的图片:
setter、getter- (void)setDevelopername:(NSString *)developername {
_developername = developername;
}
- (NSString *)developername{
return _developername;
}
错误信息
没有声明的标识符的使用,意思就是_developername没有被声明,找不到该变量,那么问题来了,为什么找不到该变量,明明已经property一个成员属性了。
property具体的作用:
@property(nonatomic,copy)NSString *developername;
1.property是定义属性,不是成员变量,声明了setter、getter方法;
在新的xocde的环境下,不加@synthesize会自动生成私有的带下划线的的成员变量、该变量的setter、getter方法 也就是这个属性的变量 = _developername并可以用setter、getter外部访问,因此子类、类外不可以直接访问,可以通过setter、getter方法进行访问;
2.property方便了内存的管理,属性修饰的关键字,strong、weak、copy等等,不同的关键字代表的含义,以及生成的setter、getter方法也是不同的 详情👈;
分析
当用户重写了setter、getter方法,那么系统也就不会自动生成私有的带下划线的的成员变量,也就是说为什么没有找到_developername这个(变量)标识了。
正确的操作姿势
添加@synthesize,生成setter、getter方法指定该属性的变量名为_developername,问题得到解决。
@synthesize developername = _developername;
上述代码代表了声明了一个新的属性developername, 又声明一个变量_developername,然后用@synthesize实现了developername的存取方法,也就是setter、getter方法;而developername = _developername的含义代表着,属性develoeprname这个属性作用的变量是_developername;
思维发散:
当用户在使用上述的属性变量进行操作的时候:
self.developername = @"测试2";
_developername = @"测试3";
NSLog(@"self.developername :%@",self.developername);
NSLog(@"_developername :%@",_developername);
当用户使用点语法self.developername的属性会直接调用自己重写的setter、getter方法进行访问,使用_developername变量的时候只是简单的赋值的操作。因此子类、类外不可以直接访问;
总结
1.property不是变量是属性。
2.property会自动生成setter、getter方法,以及属性中作用的下划线的变量。
3.@synthesize developername = _developername; 指定属性作用变量的变量名称。