簡體   English   中英

Objective-C屬性 - 保留和分配之間的差異

[英]Objective-C Property - Difference Between Retain and Assign

我想我錯過了一些關於屬性屬性的東西。 首先,我無法理解retainassign之間的區別。

如果我使用assign ,屬性是否assign retain計數器增加1到setter以及getter,我是否需要對它們使用release

這如何與readwritecopy 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必須是idSomeObjectiveCClass*

@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM