self與super

self訪問成員變量

  • <font color=purplepink>
    成員變量是定義在類中的變量,它可以被所在類的方法所調用,而局部變量是定義在方法中的變量,當局部變量的名稱與成員變量名相同時,局部變量將覆蓋成員變量,導致無法訪問成員變量.為了解決這個問題,OC提供了一個self關鍵字,它可以訪問成員變量,解決局部變量與成員變量名稱沖突的問題.
    </font>
  • <font color=yellowred>
    當使用self訪問成員變量時,由于self本身是一個指向當前對象的指針,因此,它其實就是調用self所在方法的一個對象.
    </font>

self調用方法

  • <font color = blackblue>
    對象方法中的self指向的是對象,所以只能代用對象方法;而類方法中的self指向的是類,所以只能調用類方法.
    </font>
  • <font color = bluepink>
    self調用方法的時候注意避免調用方法自己,若一個方法中利用self調用方法本身,則會造成死循環,影響程序正常使用.
    </font>

點語法

  • <font color = pinkgreen>
    當使用點語法獲取值的時候,系統會調用相關的get方法,默認的get方法名為點以后的字符.當使用點語法給變量賦值時,會調用set方法,默認的set方法名為點以后的字符首字母大寫并在前面加一個set.
    </font>
  • <font color = yellowpink>
    點語法可以實現set和get方法的調用.點語法的本質是set、get方法.
    </font>
  • <font color = red>
    在使用點語法的時候不能在set、get方法中使用點語法,負責會造成循環引用.因為執行代碼self.xx = xx時,等價于[self setXx:xx],這樣就會重復循環調用setXx方法,造成死循環.同理,當執行代碼"return self.xx"時,也會造成循環引用,只不過程序卡在setXx方法中,不能往下一步正常運行了.所以在set,get方法中避免使用點語法.
    </font>

屬性

以@property關鍵字聲明的屬性替代了成員變量的聲明,以及set和get方法的聲明有效減少了代碼.
聲明屬性的特性:

  • <font color = redy>
    原子性:默認情況下,屬性是atomic的,表示具有原子性,所以由編譯器生成的set和get方法提供了健全的在多線程的環境中訪問屬性的功能,get方法的返回值或通過set方法設置的值可以完全不受其它線程執行的影響,而進行設置.但是如果將屬性的特性設置為nonatomic,則標明set和get方法是非原子操作的,它不使用同步鎖,所以也就不能保證set和get方法不受其他線程的影響.
    </font>
  • <font color = yellowred>
    讀寫權限:Readwrite和Readonly這兩個特性控制編譯器是否讓屬性自動生成set方法,它們兩個是互斥的.

1.Readwrite:用于標識一個屬性是可讀寫的,這個特性是默認的,標明@implementation中需要同時實現set和get方法;如果在實現中使用了@synthesize指令,那么set和get方法由編譯器自動生成.
2.Readonly:用來標識一個屬性是只讀的,并且在@implementation中僅需要實現一個get方法.如果在實現中使用了@synthesize指令,那么編譯器只會生成get方法;另外,如果代碼中使用點語法進行賦值,編譯器會報錯.
</font>

  • 一個屬性的訪問和存儲方法默認是propertyName和setPropertyName.(name setName).
  • 如果某些屬性是Boolean類型,則需要在get方法上添加is作為前綴.demo:@property(nonatomic, getter = isOn) BOOL on;

set語義

  • strong:此特性用于標明屬性定義了一種"所屬關系",為這種屬性設置新值時,設置方法會保留新值并釋放舊值,然后再將新值設置上去.
  • weak:此方法定義了一種非所屬關系,為這種屬性設置新值時,設置方法不會保留新值,也不釋放舊值,此類特性與assign相似,如果目標對象被取消,那么屬性值會自動設為nil.
  • copy:標明在分配對象時會進行復制,并向原來的對象發送一個release消息,復制消息是通過調用copy方法實現的,這個特性只有在屬性是一個特性時有效,并且這個對象要實現NSCopying協議.
  • assign:標明set方法使用簡單的內存分配,這個特性是默認的,一般是針對數值進行的賦值操作.
  • retain:此特性所表達的所屬關系與strong相似,然后設置方法不會保留新值.當屬性類型為NSString類型時,經常用此特性來保護其封裝性,傳遞給設置方法的新值可能指向一個NSMutableString類的實例,這個類表示可以修改其值的字符串.

實現屬性

屬性的實現是通過@synthesize實現的.demo:@synthesize 變量名= _變量名.用來通知編譯器生成沒有在@implementation中實現set和get方法,如果沒有為屬性標記為@synthesize,那么必須為這個屬性實現set和get方法,否則編譯器會報錯.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一.self關鍵字 OC語言中的self,就相當于C++、Java中的this指針 1.類方法中的self...
    GSChan閱讀 3,648評論 0 8
  • 以前malgee也使用macdown編寫文件,不過沒怎么深入了解,由于最近要寫個用戶體驗文檔,格式比較多,就想起來...
    malgee閱讀 2,910評論 2 3
  • 睡覺前,寶寶問:媽媽,為什么你和爸爸就可以晚睡覺,我就要早睡呢? 媽媽:因為你要長高,我們已經長大了,長不高了。 ...
    土豆雞蛋閱讀 242評論 3 4
  • 測試2
    RomeoCinderella閱讀 120評論 0 0
  • 我今年六十五歲,減肥三十年,從135斤減到168斤。三十年來深受肥胖的困擾 心臟病,高血壓,脂肪肝,糖尿病,子...
    曾西伶閱讀 282評論 0 2