Выделение и выпуск класса - PullRequest
0 голосов
/ 02 декабря 2010

У меня есть один контроллер класса X, у которого есть метод экземпляра IBAction, скажем dosomething.

У меня есть другой класс Y, который выполняет некоторые вычисления и имеет делегат self.

В этом методе создается экземпляр класса Y. Теперь, где должен быть выпущен экземпляр Y. Является ли @property единственным решением для этого.

// это действие в классе X

- (IBAction) DoSomething: (идентификатор) отправителя {

Y * y = [[Y alloc] init];

// Метод init реализован в Y и выполняет некоторую работу, а также время от времени вызываются его делегаты. если мы выпустим у. это было бы крахом. Так где же место, чтобы выпустить у. Является ли @property решением, создав одноразовую память и используя ее. Есть ли способ освободить это здесь только тогда, когда в следующий раз другой объект, созданный ранее, будет уничтожен раньше, только когда делегаты закончат свою работу через некоторое время .//

// [y release]; это крах.

}

Ответы [ 3 ]

0 голосов
/ 02 декабря 2010

мне кажется, что самый простой способ решить эту проблему - вызвать Y.delegate = nil в Y dealloc и проверить, является ли Y.delegate == nil перед вызовом любого из методов Y.delegate.

0 голосов
/ 02 декабря 2010

Вы говорите, что некоторая работа выполняется в методе init класса Y. Когда некоторым делегатам нужен объект Y, пока работа не будет завершена.После чего вы хотите освободить Y.

Итак, имейте свойство для Y в этом делегате и сделайте так, чтобы оно сохранялось.отпустите его и установите ноль, как только ваша работа будет завершена.

Так что в методе dosomething () X вы можете немедленно освободить экземпляр Y.Помните об этом правиле: когда X нужен Y для того, чтобы жить до тех пор, пока его работа не будет завершена, ему просто нужно стать владельцем.

Именно поэтому сохранение количества поддерживается в Obj C. Чтобы объект мог иметь нескольковладельцы.Когда все его владельцы высвобождают объекты, из памяти удаляется только его.

0 голосов
/ 02 декабря 2010

Вы можете сделать одну вещь,

// In the .h file
// declare like this.
Y *y;

// In the .m file

-(IBAction)dosomething:(id)sender {

   if(y== nil)
      y = [[Y alloc]init];

}

и в методе dealloc, вы можете выпустить

- (void)dealloc{
  [y release];
  [super dealloc];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...