iOS開發之--屬性關鍵字以及set和get方法
一、屬性分為三大類
1、讀寫性控制
a.readOnly只讀,只會生成get方法,不會生成set方法
b.readWrite可讀可寫,會生成set方法,也會生成get方法(默認設置)
2、setter相關修飾符
a、assign:表示直接賦值,用於基本數據類型,包括id類型,這個修飾符不會牽涉到內存管理,但是如果是對象類型,使用此修飾符則可能會導致內存泄露
b、retain:針對對象類型進行內存管理,如果對基本數據類型使用,則X-code會直接報錯,當給對象類型使用此修飾符時,setter方法會先將舊的對象屬性release掉,在對新的對象進行一次賦值並進行一次retain操作;
c、copy:主要用在NSString類型,表示賦值內容
系統默認屬性是assign,retain是指針的復制不重新分配內存空間,copy是內容的復制;
3、原子性屬修飾符:atomic | nonatomic
atomic:表示是線程安全的
nonatomic:表示是非線程安全的,使用此屬性性能會提高一些
系統默認是atomic
4、getter和setter修飾符
這兩個屬性修飾符用於社差自定義生成的getter和setter方法名,使用之後將不再使用系統默認的setter和getter方法名;
1、在頭文件中用@property聲明一個屬性名,編譯器會自動為我們轉換成這個屬性名的getter方法和setter方法。
2、在實現文件中使用@synthesize propertyName,編譯器先會查找這個屬性名的setter方法和getter方法有沒有被人為實現,如果已經實現,則不再實現,如果沒有,則會幫我們生成一個屬性命的setter方法和getter方法。
3、當在實現文件中使用了@synthesize propertyName,編譯器還會做一件事情,在類成員變量中查找一個名為_propertyName的成員變量,如果沒有,再繼續查找名為propertyName的成員變量,如果這兩個都沒有,編譯器會自動為我們生成一個私有的名為_propertyName的成員變量。註意,系統自動創建的都是私有的。
4、當在實現文件中這樣寫@synthesize propertyName = varName;時,setter和getter方法所對應的是一個名為varName的成員變量,修改和讀取的是varName成員變量的值。
5、當我們在實現文件中不寫@synthesize propertyName時,在Xcode 4.5之前的版本不會幫我們自動實現setter和getter方法,系統當然也不再會為我們生成對應的成員變量。但是在Xcode 4.5之後可以不用寫@synthesize了,就跟3、4一樣了。
6、當我們既定義了@synthesize,又在實現文件中人為重寫setter和getter方法時,那麽@synthesize將不再工作,也就不會為我們創建沒有定義的_propertyName成員變量了,這時候如果在setter和getter方法中調用_propertyName將會發生編譯錯誤
iOS開發之--屬性關鍵字以及set和get方法