@property 修飾符
什麼情況使用 weak 關鍵字,相比 assign 有什麼不同?
怎麼用 copy 關鍵字?
這個寫法會出什麼問題:@property (copy) nsmutablearray *array?
如何讓自己的類用 copy 修飾符?如何重寫帶 copy 關鍵字的 setter?
@property 的本質是什麼?ivar、getter、setter 是如何生成並新增到這個類中的
@protocol 和 category 中如何使用 @property
runtime 如何實現 weak 屬性
1、讀寫性修飾符:readwrite | readonly
2、setter相關修飾符:assign | retain | copy
assign:表示直接賦值,用於基本資料型別(nsinteger和cgfloat)和c資料型別(如int, float, double, char等)另外還有id型別,這個修飾符不會牽涉到記憶體管理。但是如果是物件型別,使用此修飾符則可能會導致記憶體洩漏或exc_bad_access錯誤;
retain:針對物件型別進行記憶體管理。如果對基本資料型別使用,則xcode會直接報錯。當給物件型別使用此修飾符時,setter方法會先將舊的物件屬性release掉,再對新的物件進行一次賦值並進行一次retain操作;
copy:主要用在nsstring型別,表示複製內容;
系統預設屬性是assign。retain是指標的複製不重新分配記憶體空間,copy是內容的複製;
.原子性修飾符:atomic | nonatomic
atomic:表示是執行緒安全的。
nonatomic:表示是非執行緒安全的,使用此屬性效能會提高一些。
系統預設是atomic
4、 getter和setter修飾符
@property(getter = getmethodname, setter = setmethodname) object *obj;
這兩個屬性修飾符用於設定自定義生成的getter和setter方法名,使用之後將不再使用系統預設的setter和getter方法名;
在@property修飾符中可以出現多個修飾符,分別用逗號分隔,但是,在上述修飾符中,1,2,3組中的屬性分別之恩那個出現乙個,只有4中可以同時出現。
xcode4.2(ios sdk4.3和以下版本)和以前的版本用retain和assign
xcode4.3(ios 5和以上版本)或之後有了arc用strong和weak
assign:用於非指標變數。用於基礎資料型別(如nsinteger, cgfloat)和c資料型別(int, float, double, char等), 另外還有id型別。
記住:前面不需要加*的就用assign
retain:用於指標變數。一般用於字串(nsstring, nsmutablestring), 陣列(nsmutablearray, nsarray),字典物件,檢視物件(uiview),控制器物件(uiviewcontroller)等
strong類似於retain,weak類似於assign
最簡單的記憶:
使用assign:對基礎資料型別(如nsinteger, cgfloat)和c資料型別(int, float, double, char等), 另外還有id型別
使用copy:對nsstring型別
使用retain:對其它nsobject和其子類
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將會發生編譯錯誤
sealed修飾符簡介
sealed在修飾類時,表示密封,即該類不能繼承,不能和abstract 抽象類 同時使用,因為sealed和abstract的屬性相互排斥,abstract來修飾抽象類,需要繼承來實現功能。而在sealed修飾的類裡面的所有方法的virtual修飾符都無效。sealed修飾類的作用是防止濫用繼承,...
iOS 屬性修飾符
1.讀寫性修飾符 readwrite readonly readwrite 表明這個屬性是可讀可寫的,系統為我們建立這個屬性的setter和getter方法。readonly 表明這個屬性只能讀不能寫,系統只為我們建立乙個getter方法,不會建立setter方法 2.setter相關修飾符 ass...
修飾符 許可權修飾符
四種形式許可權修飾符的訪問情況 publicprotected不寫private 同乙個類中 四種都可以 同一包中的不同類 除了private剩下都可以 不同包下的子類 public protected 可以 不同包下的不同類 只有public可以 許可權修飾符 public protected 預...