問題
? ? 在開發(fā)當(dāng)中,遇到定義了一個屬性,需要同時重構(gòu)它的setter、getter方法,有的時候會報錯,上代碼:
@interface SetterGetterClass : NSObject
@property(nonatomic,strong)NSString *developername;
@end
? ? 這個是聲明的屬性,下面是實(shí)現(xiàn)setter、getter方法以后報錯的圖片:
- (void)setDevelopername:(NSString *)developername {
????_developername = developername;
}
- (NSString *)developername{
????return _developername;
}

錯誤信息
? ? 沒有聲明的標(biāo)識符的使用,意思就是_developername沒有被聲明,找不到該變量,那么問題來了,為什么找不到該變量,明明已經(jīng)property一個成員屬性了。
property具體的作用:
@property(nonatomic,copy)NSString *developername;
? ? 1.property是定義屬性,不是成員變量,聲明了setter、getter方法;
????在新的xocde的環(huán)境下,不加@synthesize會自動生成私有的帶下劃線的的成員變量、該變量的setter、getter方法 也就是這個屬性的變量 = _developername并可以用setter、getter外部訪問,因此子類、類外不可以直接訪問,可以通過setter、getter方法進(jìn)行訪問;
? ? 2.property方便了內(nèi)存的管理,屬性修飾的關(guān)鍵字,strong、weak、copy等等,不同的關(guān)鍵字代表的含義,以及生成的setter、getter方法也是不同的 詳情??;
分析
? ??當(dāng)用戶重寫了setter、getter方法,那么系統(tǒng)也就不會自動生成私有的帶下劃線的的成員變量,也就是說為什么沒有找到_developername這個(變量)標(biāo)識了。
正確的操作姿勢
? ? 添加@synthesize,生成setter、getter方法指定該屬性的變量名為_developername,問題得到解決。
@synthesize developername = _developername;
? ? 上述代碼代表了聲明了一個新的屬性developername, 又聲明一個變量_developername,然后用@synthesize實(shí)現(xiàn)了developername的存取方法,也就是setter、getter方法;而developername = _developername的含義代表著,屬性develoeprname這個屬性作用的變量是_developername;
思維發(fā)散:
????當(dāng)用戶在使用上述的屬性變量進(jìn)行操作的時候:
self.developername = @"測試2";
_developername = @"測試3";
NSLog(@"self.developername :%@",self.developername);
NSLog(@"_developername :%@",_developername);
? ? 當(dāng)用戶使用點(diǎn)語法self.developername的屬性會直接調(diào)用自己重寫的setter、getter方法進(jìn)行訪問,使用_developername變量的時候只是簡單的賦值的操作。因此子類、類外不可以直接訪問;
總結(jié)
? ? 1.property不是變量是屬性。
? ? 2.property會自動生成setter、getter方法,以及屬性中作用的下劃線的變量。
? ? 3.@synthesize developername = _developername; ?指定屬性作用變量的變量名稱。