[英]Do I need to send release to my instance variable in the dealloc method? (iOS)
[英]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應該沒問題嗎?
如果mainSprocket
和newSprocket
是相同的對象,則使用簡單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
,以防newSprocket
和mainSprocket
碰巧是同一對象。 的調用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.