Как освободить представление «PopUp»? - PullRequest
1 голос
/ 15 мая 2010

У меня есть этот класс, который показывает всплывающее окно. Я делаю alloc-init на этом, и это подходит.

DarkVader* darkPopUp = [[DarkVader alloc] init:theButton helpMessage:[theButton.titleLabel.text intValue] isADay:NO offset:0];

Он показывает себя, и если пользователь нажимает Ok, он исчезает. Когда я выпущу это?

Я могу сделать [самоотпуск] в классе, когда нажата кнопка ОК. Это правильно? Если я сделаю это, анализатор скажет, что у него есть счетчик удержаний +1 и он просочится в вызывающую функцию. Если я выпускаю его сразу после alloc-init, анализатор говорит, что у него есть счетчик хранения +0, и я не должен его выпускать.

    DLog(@"DarkVader retain count: %i", [darkPopUp retainCount]);

говорит, что у него счетчик удержаний 2. Я в замешательстве.

Короче говоря, мой вопрос: как освободить объект, который инициализируется, выполняет некоторую работу и завершается, но никто не может освободить его в вызывающей функции.

Ответы [ 3 ]

0 голосов
/ 15 мая 2010

Вы можете сделать что-то похожее на то, что делают существующие классы Cocoa Touch. Например, посмотрите, как вы показываете UIAlertView:

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"title" message:@"message" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
[alert release];

Совершенно очевидно, что UIAlertView делает [self retain] или, что более вероятно, сохраняется при добавлении в качестве подпредставления где-то на экране где-то в методе show.

Существуют некоторые классы Cocoa Touch, которые действительно (как упоминал Пол) не поддерживают этот способ освобождения сразу, а вместо этого вызывают метод делегата и исключают получателя для его освобождения.

Я бы сказал, что ответ: если ваш DarkVader является UIView, вы должны позволить подпредставлению сохранить количество отсчетов. Если это UIViewController или пользовательский вспомогательный класс, у вас есть несколько опций, способ делегирования простой и прямой.

0 голосов
/ 16 мая 2010

Если вам нужно пользовательское всплывающее окно в стиле, который вы описали, вы, вероятно, уже должны начинать с подкласса UIAlertView. Затем вы можете использовать уже реализованную функцию сохранения / освобождения.

0 голосов
/ 15 мая 2010

Мое предложение будет использовать

[self autorelease];

когда представление само закрывается. Хотя, если вы посмотрите на различные стандартные представления, то все реализуют обратные вызовы делегату, который становится ответственным за их закрытие; это позволяет объекту запуска также отвечать за освобождение представления. Вы также не проясняете, как отображается ваше представление (или это контроллер представления).

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