Я выпускаю эту переменную экземпляра на iPhone? - PullRequest
4 голосов
/ 25 февраля 2009

У меня есть класс, который отвечает и владелец строит мои модельные объекты. Он выделяет память для моделей и сохраняет их, а также отвечает за их освобождение, когда происходит разлочка.

Теперь у меня есть соответствующий UIViewController, который в этом случае выступает в роли клиента. Он будет иметь несколько переменных экземпляра, указывающих на нужную модель (и). Ему не нужно выделять память для них, поскольку класс, ответственный за это, уже сделал это. Мне все еще нужно освободить память от клиента? Вот пример

ModelHolder.m будет иметь что-то вроде

- (NSArray *)modelA
{
   if (modelA == nil) {
       modelA = [[ModelClassA alloc] init];
   }

   return modelA

}

- (void)dealloc { [super dealloc]; [modelA release]; }

Теперь ClientViewController будет иметь нечто похожее:

 @class myModelA;
 @interface ClientViewController : UIViewController {
     ModelClassA myModelA;
 }

 // more code
 @end
 #import "ModelHolder.h"
 @implementation ClientViewcontroller ...... etc
 - (void)viewDidLoad
 {  
     self.myModelA = [instanceOfModelHolder modelA];
 }
 - (void)dealloc {
     // am I responsible to release here?
 }

Пожалуйста, не возражайте против любых синтаксических ошибок, так как я только что написал это на лету здесь. Я думаю, что моя точка зрения была хорошо проиллюстрирована в коде, хотя.

Спасибо ..

Ответы [ 3 ]

4 голосов
/ 25 февраля 2009

Предполагая, что вы объявили свойство modelA ClientviewController как @property(retain), @property(copy) или @property(mutableCopy), вы сохраняете значение этого свойства, поэтому вы должны его освободить.

РЕДАКТИРОВАТЬ с 2013 года: при условии, что вы не используете ARC. ARC сделает это за вас, поэтому обычно вообще не нужно реализовывать dealloc под ARC. Если вы не используете ARC, вам нужно освободить все, что у вас есть.

0 голосов
/ 17 февраля 2011

Вы должны были сделать это, лежать

 - (void)viewDidLoad
 {  
     ModelClassA *myModelA = [instanceOfModelHolder modelA];
     self.myModelA = myModelA;
     [myModelA release];
 }

Как только его освобождение может привести к утечке памяти, а иногда даже к сбою приложения, если счетчик ссылок не обрабатывается должным образом.

Обратите также внимание, что вы не сделали ModelClassA myModelA; свойством, поэтому вам следует избегать его освобождения в dealloc до тех пор, пока вы не убедитесь, что его счетчик ссылок больше 1.

0 голосов
/ 25 февраля 2009

Вы должны поставить [super dealloc]; последним в своем собственном дэллоке.

- (void)dealloc
{
    [modelA release];
    [super dealloc];
}

Что касается вашего вопроса об освобождении в последнем dealloc, то это зависит от того, как вы указали @property myModelA, является ли оно свойством «retain» или «copy», которое вы должны сделать в релизе. Является ли это «копией», вы на самом деле отвечаете за новый объект.

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