property相關的問題

2021-08-03 02:51:59 字數 3479 閱讀 2472

1.因為父類指標可以指向子類物件,使用copy的目的是為了讓本物件的屬性不受外界影響,使用copy無論給我傳入是乙個可變物件還是不可物件,我本身持有的就是乙個不可變的副本.

2.如果我們使用是strong,那麼這個屬性就有可能指向乙個可變物件,如果這個可變物件在外部被修改了,那麼會影響該屬性.

用@property宣告 nsstring、nsarray、nsdictionary 經常使用copy關鍵字,是因為他們有對應的可變型別:nsmutablestring、nsmutablearray、nsmutabledictionary,他們之間可能進行賦值操作,為確保物件中的字串值不會無意間變動,應該在設定新屬性值時拷貝乙份。

1.同時重寫了setter和getter時; 2.

重寫了唯讀屬性的getter時;

3.使用了@dynamic時;

4.在 @protocol 中定義的所有屬性;

5.在 category 中定義的所有屬性;

6.過載的屬性

五.@protocol和category中如何使用@property

1.在protocol中使用property只會生成setter和getter方法宣告,我們使用屬性的目的,是希望遵守協議的物件能實現該屬性

2.category 使用 @property 也是只會生成setter和getter方法的宣告,如果我們真的需要給category增加屬性的實現,需要借助於執行時的兩個函式:objc_setassociatedobject和objc_getassociatedobject

六.什麼情況下使用weak關鍵字,相比assign有什麼不同

1.在arc中,在有可能出現迴圈引用的時候,往往要通過讓其中一端使用weak來解決,比如:delegate**屬性

2.自身已經對它進行一次強引用,沒有必要再強引用一次,此時也會使用weak,自定義iboutlet控制項屬性一般也使用weak;當然,也可以使用strong。

不同點:

1.weak 此特質表明該屬性定義了一種「非擁有關係」 (nonowning relationship)。為這種屬性設定新值時,設定方法既不保留新值,也不釋放舊值。此特質同assign類似, 然而在屬性所指的物件遭到摧毀時,屬性值也會清空(nil out)。 而 assign 的「設定方法」只會執行針對「純量型別」 (scalar type),例如 cgfloat 或 nslnteger 等)的簡單賦值操作。

2.assigin 可以用非oc物件,而weak必須用於oc物件

七.__block和__weak修飾符的區別

__block不管是arc還是mrc模式下都可以使用,可以修飾物件,還可以修飾基本資料型別。 

__weak只能在arc模式下使用,也只能修飾物件(nsstring),不能修飾基本資料型別(int)。 

__block物件可以在block中被重新賦值,__weak不可以。

八.delegate為什麼用assign而不是strong

類與類之間的關係有繼承和聚合,當我們使用聚合的時候該物件就擁有聚合的物件,這時候我們就需要使引用計數器+1來控制該物件的記憶體管理,所以strong

和copy的一項能力就是擁有該物件的記憶體管理權。

乙個物件沒必要管理自己delegate的生命週期,或者說沒必要擁有該物件,所以我們只要知道它的指標就可以了,用指標找到物件去呼叫方法,也就是委託實現的感覺。

或者我們換個角度,從記憶體管理方面也可以解釋這個問題。delegate的生命週期不需要讓該物件去控制,如果該物件使用strong很可能導致delegate所指向的物件無法正確的釋放。

九.強引用和弱引用的區別1、

weak 和 strong 屬性只有在你開啟arc時才會被要求使用,這時你是不能使用retain release autorelease 操作的,因為arc會自動為你做好這些操作,但是你需要在物件屬性上使用weak 和strong,其中strong就相當於retain屬性,而weak相當於assign。

2、只有一種情況你需要使用weak(預設是strong),就是為了避免retain cycles(就是父類中含有子類,子類中又呼叫了父類,這樣都無法release)

3、宣告為weak的指標,指標指向的位址一旦被釋放,這些指標都將被賦值為nil。這樣的好處能有效的防止野指標。

十.@property的主要關鍵字詳解

1.atomic(原子性) 與 nonatomic(非原子性)[執行緒安全]

objective-c中原子性就是為了保證執行緒安全而存在。如果當前的某一屬性為原子性,那麼任何乙個執行緒對其記性set和get方法時都會對當前的屬性進行加鎖和解鎖操作。從而保證其在多執行緒程式設計環境的執行緒安全。通常情況下,我們不會涉及過多的執行緒安全,並且加鎖和解鎖操作也會造成相當多的資源,所以我們一般都將屬性設定為非原子性。但是蘋果公司為了安全考慮出發,預設是原子性。

2.readwrite(讀寫) 與 readonly (唯讀) [訪問控制]

屬性預設情況下可以對例項變數進行取值和賦值的操作,其實質就是有set和get方法。唯讀的含義其實就是只有get方法,沒有提供set方法。為了操作的方便,蘋果將讀寫屬性設定為例項變數的預設屬性。

3.strong (強引用) 與 weak(弱引用) 與 assign(賦值) 與copy(複製)

strong表示屬性對所賦的值持有強引用表示一種「擁有關係」(owning relationship),會先保留新值即增加新值的引用計數,然後再釋放舊值即減少舊值的引用計數。只能修飾物件。如果對一些物件需要保持強引用則使用strong。

weak表示對所賦的值物件持有弱引用表示一種「非擁有關係」(nonowning relationship),對新值不會增加引用計數,也不會減少舊值的引用計數。所賦的值在引用計數為0被銷毀後,weak修飾的屬性會被自動置為nil能夠有效防止野指標錯誤。 weak常用在修飾delegate等防止迴圈引用的場景。

assign主要用來修飾objective-c中的基礎屬性。

copy修飾的屬性會在記憶體裡拷貝乙份物件,兩個指標指向不同的記憶體位址。 

一般用來修飾有對應可變型別子類的物件。 

如:nsstring/nsmutablestring,nsarray/nsmutablearray,nsdictionary/nsmutabledictionary等。 

為確保這些不可變物件因為可變子類物件影響,需要copy乙份備份,如果不使用copy修飾,使用strong或assign等修飾則會因為多型導致屬性值被修改。 copy還被用來修飾block,在arc環境下編譯器缺省會用copy修飾, 一般情況下在block需要捕獲外界資料時該block就會被分配在堆區,但在mrc環境下由於手動管理引用計數,block一般被分配在棧區,需要copy到堆區來防止野指標錯誤。

八 property相關引數介紹

1 copy使用型別 nsstring,block2 assign使用型別 delegate,int,float,nsinteger,bool,列舉,結構體.3 retain使用型別 nsarray,nsdate4 strong使用型別 nsstring block以外的oc物件 5 weak使用型...

property和 property的一些小結

在.h檔案中 inte cemyclass nsobject property nonamtic,retain myobjecct myobject end 在.m檔案中 implementation myclass synthesize myobject myobject void dealloc...

關於 property的用法

功能 讓 編譯器自動編寫乙個與 資料成員同名的方法宣告來省去讀寫方法的宣告。如 1 在標頭檔案中 property int count 等效於在標頭檔案中宣告2個方法 int count void setcount int newcount 2 實現檔案 m 中 synthesize count 等...