簡體   English   中英

為什么我應該在setter方法中將-autorelease發送給我的實例變量,而不是-release?

[英]Why should I send -autorelease to my instance variable in my setter method, rather than -release?

蘋果公司在實例變量mainSprocket的setter方法中執行此操作:

– (void)setMainSprocket:(Sprocket *)newSprocket {
    [mainSprocket autorelease];
    mainSprocket = [newSprocket retain];
    return;
}

他們為什么發送-autorelease而不是-release? -release在這里會產生不好的影響嗎? 實際上,不應(出於我的理解),因為-release僅表示實例變量mainSprocket持有的當前對象不再由該實例變量使用。 對於仍然有人對那個對象仍然感興趣的情況,該方法可以保留它,對不對? 我認為-release應該沒問題嗎?

如果mainSprocketnewSprocket是相同的對象,則使用簡單release可以將其release

如果您不想使用autorelease ,請使用以下命令:

– (void)setMainSprocket:(Sprocket *)newSprocket {
    // if newSprocket and mainSprocket were the same object, 
    // it would first be retained and then released
    // and therefore not deleted.
    [newSprocket retain];
    [mainSprocket release];
    mainSprocket = newSprocket;
    // you don't need return in a void-method
    // return;
}

為什么不使用屬性? 它們是Objective-C 2.0的實現方式。

SomeObject.h

@interface SomeObject : NSObject {
    Sprocket *mainSprocket;
}

@property(retain) Sprocket *mainSprocket;

@end

SomeObject.m

@implementation SomeObject

@synthesize mainSprocket;

@end

他們在這里進行autorelease ,以防newSprocketmainSprocket碰巧是同一對象。 的調用release可能無意中解除分配對象才可以在下一行被保留,而autorelease將不被處理,直到自動釋放池是在事件循環結束排出。

考慮這種情況:

Sprocket *mySprocket = [Sprocket spacelySprocket];
[sprocketManager setMainSprocket:mySprocket];

Sprocket *anotherPointerToMySprocket = mySprocket;
[sprocketManager setMainSprocket:anotherPointerToMySprocket];

如果未自動發布mainSprocket則最后一行會引起問題。 您有時會看到執行相同功能的setter代碼的另一種約定是:

– (void)setMainSprocket:(Sprocket *)newSprocket {
    if (newSprocket != mainSprocket) {
        [mainSprocket release];
        mainSprocket = [newSprocket retain];
    }
}

我會留給其他人評論,哪一種更合適或更美觀:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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