@interface ViewController2 (){
? ? NSString*_obj1;
}
@property(nonatomic,strong)NSString *obj1;
@end
如果存在一個 _obj1的實(shí)例變量,使用@synthesize的規(guī)則
@synthesize obj1;? //會生成一個obj1 的成員變量 和 _obj1沒有關(guān)系
@synthesize obj1 = myobj;? // 會生成一個 myobj 的成員變量?和 _obj1沒有關(guān)系
@synthesize obj1 = _obj1; // 不會生成成員變量 直接使用已經(jīng)存在的_obj1
使用場景
現(xiàn)在都是自動合成屬性變量,所以使用@synthesize 應(yīng)該是在不會自動合成的使用
以下會列出不會自動合成的情況:
1.同事重寫了setter和getter時(shí)
2.重寫了只讀的getter方法
3.使用了@dynamic時(shí)
4.在@protocol中定義的所有屬性
5.在categary中定義的所有屬性
6.重載的屬性
當(dāng)你在子類中重載了父類中的屬性绊寻,你必須 使用?@synthesize?來手動合成ivar澎媒。
除了后三條,對其他幾個我們可以總結(jié)出一個規(guī)律:當(dāng)你想手動管理 @property 的所有內(nèi)容時(shí)鼓鲁,你就會嘗試通過實(shí)現(xiàn) @property 的所有“存取方法”(the accessor methods)或者使用?@dynamic?來達(dá)到這個目的邮辽,這時(shí)編譯器就會認(rèn)為你打算手動管理 @property唠雕,于是編譯器就禁用了 autosynthesis(自動合成)。
因?yàn)橛辛?autosynthesis(自動合成)吨述,大部分開發(fā)者已經(jīng)習(xí)慣不去手動定義ivar岩睁,而是依賴于 autosynthesis(自動合成),但是一旦你需要使用ivar揣云,而 autosynthesis(自動合成)又失效了捕儒,如果不去手動定義ivar,那么你就得借助?@synthesize?來手動合成 ivar邓夕。
其實(shí)刘莹,@synthesize?語法還有一個應(yīng)用場景,但是不太建議大家使用:
可以在類的實(shí)現(xiàn)代碼里通過?@synthesize?語法來指定實(shí)例變量的名字:
@implementation CYLPerson
@synthesize firstName = _myFirstName;
@synthesize lastName = _myLastName;
@end
上述語法會將生成的實(shí)例變量命名為?_myFirstName?與?_myLastName翎迁,而不再使用默認(rèn)的名字栋猖。一般情況下無須修改默認(rèn)的實(shí)例變量名,但是如果你不喜歡以下劃線來命名實(shí)例變量汪榔,那么可以用這個辦法將其改為自己想要的名字。還是推薦使用默認(rèn)的命名方案肃拜,因?yàn)槿绻腥硕紙?jiān)持這套方案痴腌,那么寫出來的代碼大家都能看得懂。
摘自這里