iOS面試屬性 property看我就夠了!!!

2021-09-24 05:10:20 字數 4137 閱讀 7150

@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 預設是有該屬性的,這個屬性是為了保證程式在多執行緒情況,編譯器會自動生成一些互斥加鎖 避免該...