2010-06-07 76 views
3

我想我錯過了有關屬性屬性的內容。 首先,我不明白retainassign之間的區別。Objective-C屬性 - 保留和分配之間的區別

如果我使用assign,那麼屬性是否會將retain計數器增加1到setter和getter,我是否需要使用release來達到這兩個效果?

這是如何與readwritecopy一起使用的?從計數的retain的角度來看。

我想明白當我需要一個屬性(setter和getter)

@property (readwrite,assign) int iVar; 

工作後使用release什麼assign在這裏做?

之間有什麼區別:

@property (readwrite,assign) int iVar; 

@property (readwrite,retain) int iVar; 

@property (readwrite) int iVar; 

非常感謝......

回答

11

有什麼不同:@property(readwrite,assign)int iVar;到@property(readwrite,retain)int iVar; to @property(readwrite)int iVar;

@property (readwrite,assign) sometype aProperty;的二傳手是語義上等同於

-(void) setAProperty: (sometype) newValue 
{ 
    ivar = newValue; 
} 

以上是或多或少,如果你把

@asynthesize aProperty = ivar; 

在你執行你會得到什麼。

@property (readwrite,retain) sometype aProperty;設定器在語義上等同於

-(void) setAProperty: (sometype) newValue 
{ 
    [newValue retain]; 
    [ivar release]; 
    ivar = newValue; 
} 

顯然,它是沒有意義的保留或釋放一個int,所以sometype。這時候必須是idSomeObjectiveCClass*

@property (readwrite,copy) sometype aProperty;設定器在語義上相當於

-(void) setAProperty: (sometype) newValue 
{ 
    sometype aCopy = [newValue copy]; 
    [ivar release]; 
    ivar = aCopy; 
} 

在這種情況下,不僅必須某種類型成爲一個客觀的C類,但它必須迴應-copyWithZone:(或相當於執行NSCopying)。

如果您省略保留或分配或複製,則默認值爲assign。

順便說一下,我通過不考慮發生鎖定而簡化了上述內容,因爲屬性並未指定nonatomic

4

有兩種類型的說明符:

readwrite說明符告訴該屬性將被讀/寫,因此當您執行@ synthesize時,它將創建getter和setter。

還有readonly,指定該屬性將只有一個getter。

的其它改性劑指定屬性將如何表現相對於所述參考計數:

assign改性劑,告訴用戶的ivar將簡單地與任何的設定器接收被分配。所以,如果是對象,則不會調用retain

隨着retain,每當你使用合成的setter,retain將被調用,所以對象將被保留。這意味着具有setter的類在某個時刻需要release(可能在其dealloc方法中)。

至於copy,這意味着,而不是retain,該對象將收到copy消息。這意味着你最終將得到一個原始對象的副本,保留數爲1,所以你有責任釋放它。

+0

所以如果我理解正確 1.只讀指針並返回一個指針沒有改變計數器? 2.當我使用assing我只是得到指針的對象,並沒有保留,所以如果對象將釋放我會失去他? 並保留這不是這種情況? 3.至於副本我瞭解setter使計數1的新對象,並且getter只是返回指針? 那麼當我使用retain屬性時,getter的情況如何,我聽說過關於autorelease指針的一些東西? – Amir 2010-06-07 13:41:53

+0

我澄清了我的答案。有兩種說明符:一種涉及屬性的訪問方式('readwrite','readonly'),另一種涉及屬性如何處理內存('assign','retain','copy') 。你需要使用兩者,它們是正交的('readwrite'屬性可以是'retain','assign'或'copy') – pgb 2010-06-07 14:10:30

相關問題