self訪問成員變量
- <font color=purplepink>
成員變量是定義在類中的變量,它可以被所在類的方法所調(diào)用,而局部變量是定義在方法中的變量,當(dāng)局部變量的名稱與成員變量名相同時,局部變量將覆蓋成員變量,導(dǎo)致無法訪問成員變量.為了解決這個問題,OC提供了一個self關(guān)鍵字,它可以訪問成員變量,解決局部變量與成員變量名稱沖突的問題.
</font> - <font color=yellowred>
當(dāng)使用self訪問成員變量時,由于self本身是一個指向當(dāng)前對象的指針,因此,它其實就是調(diào)用self所在方法的一個對象.
</font>
self調(diào)用方法
- <font color = blackblue>
對象方法中的self指向的是對象,所以只能代用對象方法;而類方法中的self指向的是類,所以只能調(diào)用類方法.
</font> - <font color = bluepink>
self調(diào)用方法的時候注意避免調(diào)用方法自己,若一個方法中利用self調(diào)用方法本身,則會造成死循環(huán),影響程序正常使用.
</font>
點語法
- <font color = pinkgreen>
當(dāng)使用點語法獲取值的時候,系統(tǒng)會調(diào)用相關(guān)的get方法,默認(rèn)的get方法名為點以后的字符.當(dāng)使用點語法給變量賦值時,會調(diào)用set方法,默認(rèn)的set方法名為點以后的字符首字母大寫并在前面加一個set.
</font> - <font color = yellowpink>
點語法可以實現(xiàn)set和get方法的調(diào)用.點語法的本質(zhì)是set、get方法.
</font> - <font color = red>
在使用點語法的時候不能在set姿锭、get方法中使用點語法,負(fù)責(zé)會造成循環(huán)引用.因為執(zhí)行代碼self.xx = xx時,等價于[self setXx:xx],這樣就會重復(fù)循環(huán)調(diào)用setXx方法,造成死循環(huán).同理,當(dāng)執(zhí)行代碼"return self.xx"時,也會造成循環(huán)引用,只不過程序卡在setXx方法中,不能往下一步正常運(yùn)行了.所以在set,get方法中避免使用點語法.
</font>
屬性
以@property關(guān)鍵字聲明的屬性替代了成員變量的聲明
,以及set和get方法的聲明
有效減少了代碼.
聲明屬性的特性:
- <font color = redy>
原子性:默認(rèn)情況下,屬性是atomic的,表示具有原子性,所以由編譯器生成的set和get方法提供了健全的在多線程的環(huán)境中訪問屬性的功能,get方法的返回值或通過set方法設(shè)置的值可以完全不受其它線程執(zhí)行的影響,而進(jìn)行設(shè)置.但是如果將屬性的特性設(shè)置為nonatomic,則標(biāo)明set和get方法是非原子操作的,它不使用同步鎖,所以也就不能保證set和get方法不受其他線程的影響.
</font> - <font color = yellowred>
讀寫權(quán)限:Readwrite和Readonly這兩個特性控制編譯器是否讓屬性自動生成set方法,它們兩個是互斥的.
1.Readwrite:用于標(biāo)識一個屬性是可讀寫的,這個特性是默認(rèn)的,標(biāo)明@implementation中需要同時實現(xiàn)set和get方法;如果在實現(xiàn)中使用了@synthesize指令,那么set和get方法由編譯器自動生成.
2.Readonly:用來標(biāo)識一個屬性是只讀的,并且在@implementation中僅需要實現(xiàn)一個get方法.如果在實現(xiàn)中使用了@synthesize指令,那么編譯器只會生成get方法;另外,如果代碼中使用點語法進(jìn)行賦值,編譯器會報錯.
</font>
- 一個屬性的訪問和存儲方法默認(rèn)是propertyName和setPropertyName.(name setName).
- 如果某些屬性是Boolean類型,則需要在get方法上添加is作為前綴.demo:@property(nonatomic, getter = isOn) BOOL on;
set語義
- strong:此特性用于標(biāo)明屬性定義了一種"所屬關(guān)系",為這種屬性設(shè)置新值時,設(shè)置方法會保留新值并釋放舊值,然后再將新值設(shè)置上去.
- weak:此方法定義了一種非所屬關(guān)系,為這種屬性設(shè)置新值時,設(shè)置方法不會保留新值,也不釋放舊值,此類特性與assign相似,如果目標(biāo)對象被取消,那么屬性值會自動設(shè)為nil.
- copy:標(biāo)明在分配對象時會進(jìn)行復(fù)制,并向原來的對象發(fā)送一個release消息,復(fù)制消息是通過調(diào)用copy方法實現(xiàn)的,這個特性只有在屬性是一個特性時有效,并且這個對象要實現(xiàn)NSCopying協(xié)議.
- assign:標(biāo)明set方法使用簡單的內(nèi)存分配,這個特性是默認(rèn)的,一般是針對數(shù)值進(jìn)行的賦值操作.
- retain:此特性所表達(dá)的所屬關(guān)系與strong相似,然后設(shè)置方法不會保留新值.當(dāng)屬性類型為NSString類型時,經(jīng)常用此特性來保護(hù)其封裝性,傳遞給設(shè)置方法的新值可能指向一個NSMutableString類的實例,這個類表示可以修改其值的字符串.
實現(xiàn)屬性
屬性的實現(xiàn)是通過@synthesize實現(xiàn)的.demo:@synthesize 變量名= _變量名.
用來通知編譯器生成沒有在@implementation中實現(xiàn)set和get方法,如果沒有為屬性標(biāo)記為@synthesize,那么必須為這個屬性實現(xiàn)set和get方法,否則編譯器會報錯.