@property() = ivar + getter + setter;
「屬性」 (property)作為 objective-c 的一項特性,主要的作用就在於封裝物件中的資料。使用@property 系統會自動生成setter和getter方法;
完成屬性定義後,編譯器會自動編寫訪問這些屬性所需的方法,此過程叫做「自動合成」(@synthesize)。除了生成方法** getter、setter 之外,編譯器還要自動向類中新增適當型別的例項變數,並且在屬性名前面加下劃線,以此作為例項變數的名字
在 protocol 中使用 property只會生成 setter 和 getter 方法宣告,並沒有實現的方法,我們使用屬性的目的,是希望遵守我協議的物件能實現該屬性category 使用 @property 也是只會生成 setter 和 getter 方法的宣告,如果我們真的需要給 category 增加屬性的實現,需要借助於執行時的兩個函式:
- objc_setassociatedobject()
- objc_getassociatedobject()
對應基本資料型別預設關鍵字是
對於普通的 objective-c 物件
屬性可以擁有的特質分為四類:
atomic能保證執行緒安全嗎?
atomic底層實現
//implementation
@synthesize icode = _icode;
//set
-(void)seticode:(uiimage *)icode
}}//get
-(uiimage *)icode
return image;
}
@synchronized (self),對,效能最低的一把?或許蘋果大大有自己的用意吧。。。
關於?後續文章會詳細介紹!!!
總結:
atomic:系統自動生成的getter/setter方法會進行加鎖操作
noatomic:系統自動生成的getter/setter方法不會進行加鎖操作
用途:
block 使用 copy 是從 mrc 遺留下來的「傳統」,在 mrc 中,方法內部的 block 是在棧區的,使用 copy 可以把它放到堆區.在 arc 中寫不寫都行:對於 block 使用 copy 還是 strong 效果是一樣的,但寫上 copy 也無傷大雅,還能時刻提醒我們:編譯器自動對 block 進行了 copy 操作。如果不寫 copy ,該類的呼叫者有可能會忘記或者根本不知道「編譯器會自動對 block 進行了 copy 操作」,他們有可能會在呼叫之前自行拷貝屬性值。這種操作多餘而低效。
重寫帶copy關鍵字的setter方法
- (void)setname:(nsstring *)name
差異
不管是集合類物件(nsarray、nsdictionary、nsset … 之類的物件),還是非集合類物件(nsstring, nsnumber … 之類的物件),接收到copy和mutablecopy訊息時,都遵循以下準則:
非集合類物件的copy與mutablecopy
在非集合類物件中,對不可變物件進行copy操作,是指標複製,mutablecopy操作是內容複製;
對可變物件進行copy和mutablecopy都是內容複製。用**簡單表示如下:
nsstring *str = @"hello word!";
nsstring *strcopy = [str copy] // 指標複製,strcopy與str的位址一樣
nsmutablestring *strmcopy = [str mutablecopy] // 內容複製,strmcopy與str的位址不一樣
nsmutablestring *mutablestr = [nsmutablestring stringwithstring: @"hello word!"];
nsstring *strcopy = [mutablestr copy] // 內容複製
nsmutablestring *strmcopy = [mutablestr mutablecopy] // 內容複製
集合類物件的copy與mutablecopy (同上)
在集合類物件中,對不可變物件進行copy操作,是指標複製,mutablecopy操作是內容複製;
對可變物件進行copy和mutablecopy都是內容複製。但是:集合物件的內容複製僅限於物件本身,對集合內的物件元素仍然是指標複製。(即單層內容複製)
nsarray *arr = @[@[@"a", @"b"], @[@"c", @"d"];
nsarray *copyarr = [arr copy]; // 指標複製
nsmutablearray *mcopyarr = [arr mutablecopy]; //單層內容複製
nsmutablearray *array = [nsmutablearray arraywithobjects:[nsmutablestring stringwithstring:@"a"],@"b",@"c",nil];
nsarray *copyarr = [mutablearr copy]; // 單層內容複製 nsmutablearray *mcopyarr = [mutablearr mutablecopy]; // 單層內容複製
【總結一句話】:
只有對不可變物件進行copy操作是指標複製(淺複製),其它情況都是內容複製(深複製)!
問題:新增,刪除,修改陣列內的元素的時候,程式會因為找不到對應的方法而崩潰。
如:-[__nsarrayi removeobjectatindex:]: unrecognized selector sent to instance 0x7fcd1bc30460
copy後返回的是不可變物件(即 arr 是 nsarray 型別,nsarray 型別物件不能呼叫 nsmutablearray 型別物件的方法)
原因:是因為 copy 就是複製乙個不可變 nsarray 的物件,不能對 nsarray 物件進行新增/修改。
若想令自己所寫的物件具有拷貝功能,則需實現 nscopying 協議。如果自定義的物件分為可變版本與不可變版本,那麼就要同時實現 nscopying 與 nsmutablecopying 協議。
具體步驟:
// retain
- (void)setname:(nsstring *)str
// copy
- (void)setname:(nsstring *)str
@property有兩個對應的詞,
如果@synthesize和@dynamic都沒有寫,那麼預設的就是 @synthesize var = _var;
// 在類的實現**裡通過 @synthesize 語法可以來指定例項變數的名字。(@synthesize var = _newvar;)
objective-c的資料型別有
這些都是class,建立後便是物件,而什麼樣的定西能被稱為物件??
繼承nsobject nsproxy才能叫物件
而c語言的基本資料型別int,只是一定位元組的記憶體空間,用於存放數值;nsinteger是基本資料型別,並不是nsnumber的子類,當然也不是nsobject的子類。nsinteger是基本資料型別int或者long的別名(nsinteger的定義typedef long nsinteger),它的區別在於,nsinteger會根據系統是32位還是64位來決定是本身是int還是long。
答:id 宣告的物件具有執行時的特性,即可以指向任意型別的objcetive-c的物件。
是為了防止delegate兩端產生不必要的迴圈引用。
@property (nonatomic, weak) id delegate;
開始敲黑板了!!常見的都是weak,不常見的在**???
nsurlsession**的強引用
行筆簡陋,如有問題,敬請指正!下期再見! ios開發中 property的屬性介紹
大家都知道 property和 synthesize可以自動生成某個類成員變數的訪問方法,但可能對property中的一些屬性不是很了解,網上的一些介紹有的不是很正確,感覺會誤導新手,於是準備詳細介紹一下property中的詳細屬性。先介紹一下預設的情況 readwrite 這個屬性是預設的情況,會...
ios程式設計 property的屬性列表分析
2013 05 30 00 35 54人閱讀收藏 舉報property ioscopy 很多在學習objective c的時候,都會對 property的使用方法感到困惑。但是呢,property又是我們最常使用的以一種機制,很多人在抄寫ios程式設計實戰 時,對於 property strong,...
iOS開發中 property的屬性介紹
property與 synthesize是成對出現的,可以自動生成某個類成員變數的訪問方法。在xcode4.5以及以後的版本,synthesize可以省略。1.atomic與nonatomic atomic 預設是有該屬性的,這個屬性是為了保證程式在多執行緒情況,編譯器會自動生成一些互斥加鎖 避免該...