iOS Objective-C为什么属性(property)同时

2018-01-29  本文已影响16人  struggle3g

问题

    在开发当中,遇到定义了一个属性,需要同时重构它的setter、getter方法,有的时候会报错,上代码:

@interface SetterGetterClass : NSObject

@property(nonatomic,strong)NSString *developername;

@end

    这个是声明的属性,下面是实现setter、getter方法以后报错的图片:

- (void)setDevelopername:(NSString *)developername {

    _developername = developername;

}

- (NSString *)developername{

    return _developername;

}

setter、getter

错误信息

    没有声明的标识符的使用,意思就是_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;  指定属性作用变量的变量名称。

上一篇 下一篇

猜你喜欢

热点阅读