Как самостоятельно уничтожить объект в объективе-c? - PullRequest
2 голосов
/ 24 сентября 2011

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

AnObject *object;
- (void)function 
{
     object = [[AnObject alloc] init];
     [object doYourJob];
     //The program continue to run next line, it don't stop here. So, I can't send a [object release] here
}

- (void)callThisWhenFinish
{
 //do something
 //can't call [object release] because it is in the stack and run a line of a released object
}

Итак, как я могу освободить память объекта, я пытаюсь это:

  • Отправьте [object release] в callThisWhenFinish или function. - Потерпеть поражение! Программа все равно должна запустить несколько строк AnObject.
  • Использовать делегированный способ запуска callThisWhenFinish. - Потерпеть поражение! Я не могу выпустить AnObject, потому что он пытается запустить следующую строку, когда функция callThisWhenfinish завершается.
  • Используйте NSNotificationCenter, чтобы отправить уведомление на callThisWhenFinish. Потерпеть поражение! Когда я публикую уведомление, оно немедленно вызывает, callThisWhenFinish и AnObject могут запустить следующую строку, и это освобождает, вызывая сбой.
  • Используйте тот же NSNotificationCenter с задержкой на нем. Насколько это безопасно? Как я могу знать, что AnObject больше не будет вызываться?
  • Использовать [объектный выпуск]. Это работа, но я не знаю, когда это будет сделано. Мой AnObject использует много оперативной памяти и должен быть свободен как можно быстрее.

Есть еще идеи?

Ответы [ 2 ]

4 голосов
/ 24 сентября 2011

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

AnObject *object;
- (void)function {
    object = [[AnObject alloc] init];
    [object doYourJob];
    [object release];
}
- (void)callThisWhenFinish {
    //do something
}

В AnObject:

- (void)doYourJob {
    [self retain];
    // enter background and call backgroundMethod
}
- (void)backgroundMethod {
    // This is the method which doYourJob calls in the background to do the work
    // Do some work
    [delegate callThisWhenFinish];
    // do whatever else needs to be done
    [self release];
}
1 голос
/ 24 сентября 2011

Если вы не можете сделать это иваром, почему бы не что-то вроде этого:

 - (void)callThisWhenFinishAndRelease:(id)obj

Тогда у вас есть указатель на него.

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