Ваш интерфейс никогда не будет предоставлять достаточно информации о том, что вы должны или не должны выпускать (но он предоставит подсказки).
У вас могут быть все ивары и свойства, которые вы объявили выше, но если вы не инициализировали их и / или не обращались к их свойствам, то никогда не будет объекта, который будет освобожден в первую очередь.
Правило большого пальца:
1) Если вы создаете, копируете или сохраняете объект, вы несете ответственность за его освобождение.
2) См. Правило № 1 выше.
На практике, вот несколько примеров:
@implementation...
...
pic_one = [UIImage imageNamed:@"test.png"];
...
@end
pic_one
объявлен как ивар, но назначен объекту с автоматическим выпуском. Вы не должны выпускать это.
Другой пример:
@implementation....
...
self.pic_one = [UIImage imageNamed:@"test.png"];
...
@end
Вы присвоили этот объект UIImage через его оценщик / свойство, которое объявлено как сохраняемое, поэтому вы несете ответственность за его освобождение. «За кулисами», вот что происходит, когда вы присваиваете объект через его свойство (пример для свойств, объявленных как retain, копия будет немного отличаться, но тот же принцип).
- (void)setPic_One:(UIImage*)newImage
{
if (pic_One != newImage)
{
[newImage retain];
[pic_One release];
pic_One = newImage;
}
}
И последний:
UIImage *testImage = [[UIImage alloc] initWithImage:@"test.png"];
self.pic_one = testImage;
[testImage release];
В этом случае вы выделяете / инициируете (создаете) объект UIImage, поэтому вы несете ответственность за его освобождение. В то же время вы также присваиваете его свойству, объявленному как сохраняемое, поэтому вы обязаны также освободить его, когда закончите с этим (обычно в вашем методе dealloc).