Допустим, у нас есть некоторый код, который выглядит следующим образом:
@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
Должен ли я освобождать свойство someString
в методе dealloc SomeClass
, даже если было установлено someString
к автоматическому выпуску, и я никогда не сохранял его в моем методе init
?Если это так, я бы просто добавил [someString release]
перед [super dealloc]
в методе -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
.Итак, что я должен сделать, чтобы убедиться, что у меня нет утечек памяти здесь?Я мог бы подумать о следующем:
- Очевидно, я бы подумал о вызове
[someSprite release]
в SomeLayer
-dealloc
методе.но это дает мне EXC_BAD_ACCESS
в [super dealloc]
(следующая строка).Скорее всего, потому что я не удалил дочерний элемент, а суперкласс пытается получить доступ к только что освобожденному дочернему элементу. - Я вызываю
[self removeChild:someSprite cleanup:YES]
в методе -dealloc
, который удаляет дочерний элемент и также освобождаетЭто.Поэтому мне не нужно следить за [someSprite release]
.Но эй, метод -dealloc
суперкласса CCNode
уже делает все это для меня. - Я ничего не делаю.Я бы не стал переопределять метод
-dealloc
.Что ж, похоже, это работает нормально, но это противоречит утверждению: «если вы сохраняете что-то, вы должны его освободить».
Любая помощь в том, почему я должен освободить объект в случае, если яи почему бы и нет в случае, если II на ранней стадии поможет сэкономить много проблем, связанных с памятью, в долгосрочной перспективе.
Спасибо