Это должно быть выпущено? - PullRequest
2 голосов
/ 18 марта 2010

Я провел много исследований о том, когда правильно выпускать вещи, но это все меня смущает. Я думаю, что иногда программа Leaks отключена. Во всяком случае ...

фон представляет собой UIImageView

background.image = [UIImage imageNamed:@"greenbackground.png"];

Нужно ли выпускать фон? Я никогда не выделял его, и он не установлен как свойство, поэтому я думаю нет.

Ответы [ 3 ]

2 голосов
/ 18 марта 2010

На самом деле, вам нужно выпустить его.

UIKit использует Key Value Coding для назначения IBOutlets контроллеру. По умолчанию это заставляет ваш контроллер увеличить количество сохраняемых данных на единицу. Из документов KeyValueCoding:

If you have not defined a setter, then UIKit will directly set the value of the instance variable and then, for anything other than an NSNumber or NSValue date type, UIKit will retain the value after autoreleasing the instance variable’s old value.

Если вы явно не установили @property с assign, вам нужно освободить объект.

0 голосов
/ 18 марта 2010

Обязательно отметьте, что вы несете ответственность за освобождение UIImageView, если он был создан из пера, если background является IBOutlet и если background не имеет соответствующего свойства "assign".

Даже если вы управляете этим правильно, вы все равно можете увидеть некоторую дополнительную память, используемую в ObjectAlloc после того, как вы отпустите свой UIImageView. Это потому, что -[UIImage imageNamed:] кэширует изображение, которое вы загружаете, в ожидании повторного вызова -[UIImage imageNamed:]. Изображение не обязательно кэшируется, даже когда возвращаемый UIImage освобождается.

0 голосов
/ 18 марта 2010

Нет, ты не. Этот фабричный метод возвращает автоматически выпущенный UIImage. Хорошее практическое правило, которое помогает мне в цели c, - всякий раз, когда вы видите alloc, copy или new в имени метода ... вы отвечаете за освобождение возвращенного объекта ... все остальное должно быть объектом с автоматическим освобождением. Кроме того, я не могу представить какие-либо методы уровня класса (+) в API, которые не возвращают автоматически выпущенные объекты.

EDIT Я читаю ваш вопрос слишком быстро ... Марк прав в этом. Если вы когда-либо сомневаетесь в таких вещах, вы всегда можете сделать простой тест и записать счетчик остатков.

...