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方法,否則編譯器會報錯.