@synthesize合成實例變量的規(guī)則與使用場景

@interface ViewController2 (){

? ? NSString*_obj1;

}

@property(nonatomic,strong)NSString *obj1;

@end

如果存在一個 _obj1的實例變量,使用@synthesize的規(guī)則

@synthesize obj1;? //會生成一個obj1 的成員變量 和 _obj1沒有關系

@synthesize obj1 = myobj;? // 會生成一個 myobj 的成員變量?和 _obj1沒有關系

@synthesize obj1 = _obj1; // 不會生成成員變量 直接使用已經(jīng)存在的_obj1



使用場景

現(xiàn)在都是自動合成屬性變量,所以使用@synthesize 應該是在不會自動合成的使用

以下會列出不會自動合成的情況:

1.同事重寫了setter和getter時

2.重寫了只讀的getter方法

3.使用了@dynamic時

4.在@protocol中定義的所有屬性

5.在categary中定義的所有屬性

6.重載的屬性

當你在子類中重載了父類中的屬性,你必須 使用?@synthesize?來手動合成ivar。

除了后三條,對其他幾個我們可以總結出一個規(guī)律:當你想手動管理 @property 的所有內容時,你就會嘗試通過實現(xiàn) @property 的所有“存取方法”(the accessor methods)或者使用?@dynamic?來達到這個目的,這時編譯器就會認為你打算手動管理 @property,于是編譯器就禁用了 autosynthesis(自動合成)。

因為有了 autosynthesis(自動合成),大部分開發(fā)者已經(jīng)習慣不去手動定義ivar,而是依賴于 autosynthesis(自動合成),但是一旦你需要使用ivar,而 autosynthesis(自動合成)又失效了,如果不去手動定義ivar,那么你就得借助?@synthesize?來手動合成 ivar。

其實,@synthesize?語法還有一個應用場景,但是不太建議大家使用:

可以在類的實現(xiàn)代碼里通過?@synthesize?語法來指定實例變量的名字:

@implementation CYLPerson

@synthesize firstName = _myFirstName;

@synthesize lastName = _myLastName;

@end

上述語法會將生成的實例變量命名為?_myFirstName?與?_myLastName,而不再使用默認的名字。一般情況下無須修改默認的實例變量名,但是如果你不喜歡以下劃線來命名實例變量,那么可以用這個辦法將其改為自己想要的名字。還是推薦使用默認的命名方案,因為如果所有人都堅持這套方案,那么寫出來的代碼大家都能看得懂。

摘自這里

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容