讓我們說我們有一些代碼,看起來象下面這樣:我已經設置了我的財產保留,即使它設置爲autorelease我應該釋放它嗎?
@interface SomeClass : NSObject
@property (nonatomic, retain) NSString *someString;
@end
@implementation SomeClass
@synthesize someString;
-(id)init {
if (self=[super init]) {
someString = [NSString stringWithString:@"some string"];
}
return self;
}
@end
我應該釋放的SomeClass
dealloc方法的someString
財產,即使someString
被設置爲自動釋放,我從來沒有真正保留它我的init
方法?如果是這樣,我只需在[super dealloc]
之前在-release
方法中加上[someString release]
即可。正確?
現在我遇到的真正問題是,在使用Cocos2D時,我遇到了矛盾的情況。我的代碼看起來像下面:
@interface SomeLayer : CCLayer
@property (nonatomic, retain) CCSprite *someSprite;
@end
@implementation SomeLayer
@synthesize someSprite;
-(id)init {
if (self=[super init]) {
someSprite = [CCSprite spriteWithFile:@"SomeFile.png"];
[self addChild:someSprite];
}
return self;
}
@end
現在,我已經添加someSprite
作爲一個孩子到我的層SomeLayer
。那麼,我該怎麼做才能確保我在這裏沒有內存泄漏?我能想到以下幾點:
- 很顯然,我倒是覺得在
SomeLayer
的-dealloc
方法調用[someSprite release]
的。但它在[super dealloc]
(下一行)給我EXC_BAD_ACCESS
。很可能是因爲我沒有移除孩子,超類試圖訪問我剛發佈的孩子。 - 我在
-dealloc
方法中調用[self removeChild:someSprite cleanup:YES]
,該方法會刪除孩子並釋放它。所以我不需要跟進[someSprite release]
。但是,嘿,超類CCNode
的-dealloc
方法已經爲我做了。 - 我什麼都不做。我根本不會重寫
-dealloc
方法。那麼,這似乎工作得很好,但它與以下陳述相矛盾:「如果你保留了某些東西,你應該釋放它」。
對於爲什麼我必須在I情況下釋放對象的任何幫助,以及爲什麼不在情況II中處於早期階段將有助於從長遠角度節省大量與內存相關的問題。
感謝
你是對分配給'someString'而不是'self.someString'。底層的'@ synthesize'代碼現在保留了我的屬性,我可以用'-dealloc'方法釋放它。很好去:) – Himanshu