[英]Objective-C Property - Difference Between Retain and Assign
我想我錯過了一些關於屬性屬性的東西。 首先,我無法理解retain
和assign
之間的區別。
如果我使用assign
,屬性是否assign
retain
計數器增加1到setter以及getter,我是否需要對它們使用release
?
這如何與readwrite
或copy
? 從retain
計數的角度來看。
我試圖了解何時需要在使用屬性(setter和getter)后使用release
@property (readwrite,assign) int iVar;
assign
在這做什么?
有什么區別:
@property (readwrite,assign) int iVar;
和
@property (readwrite,retain) int iVar;
和
@property (readwrite) int iVar;
非常感謝...
有什么不同:@property(readwrite,assign)int iVar; 到@property(readwrite,retain)int iVar; 到@property(readwrite)int iVar;
@property (readwrite,assign) sometype aProperty;
的setter @property (readwrite,assign) sometype aProperty;
在語義上等同於
-(void) setAProperty: (sometype) newValue
{
ivar = newValue;
}
如果放的話,上面的內容或多或少都會得到
@asynthesize aProperty = ivar;
在你的實施中。
@property (readwrite,retain) sometype aProperty;
的setter @property (readwrite,retain) sometype aProperty;
在語義上等同於
-(void) setAProperty: (sometype) newValue
{
[newValue retain];
[ivar release];
ivar = newValue;
}
顯然,保留或釋放int是沒有意義的,因此sometype必須是id
或SomeObjectiveCClass*
@property (readwrite,copy) sometype aProperty;
的setter @property (readwrite,copy) sometype aProperty;
在語義上等同於
-(void) setAProperty: (sometype) newValue
{
sometype aCopy = [newValue copy];
[ivar release];
ivar = aCopy;
}
在這種情況下,不僅sometype必須是一個客觀的C類,但它必須響應-copyWithZone:
或等效地,實現NSCopying
)。
如果省略保留或分配或復制,則默認為assign。
順便說一下,我通過不考慮發生的鎖定來簡化上述內容,因為屬性也沒有指定nonatomic
。
有兩種說明符:
readwrite
說明符告訴該屬性是讀/寫的,因此當你執行@ synthesize
,它將同時創建getter和setter。
還有readonly
,指定該屬性只會有一個getter。
其他修飾符指定屬性在引用計數方面的行為方式:
assign
修飾符告訴ivar將簡單地分配setter接收的任何內容。 因此,如果是對象,則不會調用retain
。
使用retain
,無論何時使用合成的setter,都會調用retain
,因此將保留該對象。 這意味着具有setter的類需要在某個時刻release
它(可能在它的dealloc
方法中)。
對於copy
,這意味着對象將接收copy
消息而不是retain
。 這意味着您最終會獲得原始對象的副本,保留計數為1,因此您需要負責釋放它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.