您好,登錄后才能下訂單哦!
學習iOS開發時,會遇到這樣那樣的問題,那么大家有沒有遇到過@synthesizewindow=_window;,在這里面window與_window分別代表什么知道嗎?它們的差別在哪,又如何用使用它們,這是學習iOS開發中最常見的問題了。
這里也會涉及到Objective-C中對類、類的屬性、類的存取器、類的局部變量的理解:藍鷗iOS培訓推薦:
在32位系統中,如果類的@interface部分沒有進行ivar聲明,但有@property聲明,在類的@implementation部分有響應的@synthesize,則會得到類似下面的編譯錯誤:
Synthesizedproperty'xX'musteitherbenamedthesameasacompatibleivarormustexplicitly
nameanivar在64-bit時,運行時系統會自動給類添加ivar,添加的ivar以一個下劃線"_"做前綴。
上面聲明部分@synthesizewindow=_window;意思是說,window屬性為_window實例變量合成訪問器方法。
也就是說,window屬性生成存取方法是setWindow,這個setWindow方法就是_window變量的存取方法,它操作的就是_window這個變量。通過這個看似是賦值的這樣一個操作,我們可以在@synthesize中定義與變量名不相同的getter和setter的命名,籍此來保護變量不會被不恰當的訪問。
下面給大家舉一個最常見的例子,一看就明白了:
寫法一:
寫法二:
這個類中聲明了一個變量_myObject,又聲明了一個屬性叫myObject,然后用@synthesize生成了屬性myObject的存取方法,這個存取方法的名字應該是:setmyObject和getmyObject。@synthesizemyObject=_myObject的含義就是屬性myObject的存取方法是做用于_myObject這個變量的。這種用法在Apple的SampleCode中很常見。
那么,一樣是存取操作語句整理
兩種賦值方式的區別何在呢?
self.nameVarPtr=xxx這種賦值方式等價于調用[selfsetnameVarPtr:xxx],而setnameVarPtr:xxx的方法的
實現又是依賴于@propert
y的屬性的,比如retain,assign等屬性。
nameVarPtr=xxx的賦值方式,僅僅是對一個指針進行賦值。nameVarPtr僅僅是一個指針變量,記錄了xxx的
地址。在這個過程中不會調用setter方法,不會調用setter方法,就和@property沒有關系,從而,也和retain
,assign等屬性沒有關系。這種賦值方式就是一個簡單的指針賦值。
從上面的說法中得出,對成員變量進行賦值,為防內存泄露,就一定要注意以下兩點:
1、self調用setter方法的方式
2、指針賦值方式,不會調用setter方法
總結:在給某個變量賦值的時候,要盡量寫self.myObj=xxx;因為這種方法最可靠,最實用的方法,在iOS開發中用起來就會很方便了,我是藍鷗蔣杏飛,有相同愛好的同仁們可以相互討論下下。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。