Нужно ли освобождать объекты, которые я не сохраняю? - PullRequest
1 голос
/ 20 января 2012

Я сохраняю ссылку на объект example, но никогда не использую retain, new или copy.

@interface ExampleViewController : UIViewController
{
    IBOutlet UILabel *example;
}

@end

Если я подключу объект UILabel в Интерфейсном Разработчике к example, количество сохранений будет равно двум. Но когда я не подключаю его, счетчик сохранения равен нулю. Я думаю, что я сохраняю одну ссылку, а точка зрения - другую, поэтому мне нужно ее опубликовать. Что ты думаешь?

Ответы [ 3 ]

2 голосов
/ 20 января 2012

IBOutlet переменные экземпляра являются особым случаем. В iOS каждая переменная экземпляра IBOutlet сохраняется при загрузке NIB, поэтому вам необходимо освободить их самостоятельно.

На самом деле, вы должны быть особенно осторожны, чтобы освободить и обнулить эти IBOutlets в -viewDidUnload:, иначе они будут вытекать при перезагрузке NIB.

Обратите внимание, что это на самом деле отличается от разработки под Mac OS X, где IBOutlets не сохраняются, если это не объект NIB верхнего уровня без родительского представления или окна.

По этой причине Apple теперь рекомендует выставлять IBOutlets через свойства, а не переменные экземпляра. Таким образом, право собственности на торговую точку четко определено.

@property (nonatomic, assign) IBOutlet UIButton* myButton;
@property (nonatomic, retain) IBOutlet NSObject* someObject;

myButton не нужно было бы освобождать; someObject должен быть освобожден. И в обоих случаях вы несете ответственность за очистку этих переменных в -viewDidUnload:.

1 голос
/ 20 января 2012

Если вы используете ARC, вам не нужно освобождать переменную экземпляра, поскольку она будет освобождена, когда ваш экземпляр будет освобожден. Если вы не используете ARC, вы должны написать свой метод -dealloc в ExampleViewController следующим образом:

- (void)dealloc
{
    [example release];

    [super dealloc];
}

Обратите внимание, что если вы установите example вручную без использования ARC, оно не будет автоматически сохранено. Однако, поскольку вы используете перо, будет сохраняться при его настройке.

0 голосов
/ 20 января 2012

Вам необходимо освободить их в - (void) dealloc, если вы не используете ARC, и для вашего IBOutlet есть свойство, и вам нужно освободить и обнулить их в viewDidUnload:.

Рассмотрите возможность использования ARC (автоматического сохранения счета) для вашего проекта. С ARC компилятор заботится о сохранении счетчиков, поэтому вам не нужно, на самом деле это не разрешено. Существует рефакторинг, который преобразует текущий проект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...