1

Рассмотрим следующую ситуацию.Способ Rigtht для реализации методов Aysnchronous Delegate

-(void) foo { 

    Object * obj = [[Object alloc] init]; 

    obj.delegate = self; 

    [obj excuteAsync]; 
} 

-(void) delegateMethodReturned { 
    // do something 
} 

Здесь executeAync возвращается асинхронно через некоторое время. Таким образом, мы не можем безопасно освободить объект. Каков наилучший шаблон проектирования для реализации такой ситуации без объявления obj как iVar.

Благодаря

+0

Лучший дизайн - это сделать iVar. У вас «есть», потому что он длится дольше, чем foo. Просто. Он не является самодостаточным внутри foo, поэтому он не должен быть локальным для foo. Просто. Просто потому, что вы создаете что-то внутри foo, это не значит, что он концептуально существует только внутри foo, так как в этом случае он намного больше, чем просто foo. Просто! Случай настолько ясен, я бы сказал, что вы «должны» сделать его iVar. – Fattie

ответ

1

Если вы можете настроить iOS4, вы можете обойти асинхронный обратный вызов с использованием блоков и GCD.

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_async(queue,^{ 
    Object * obj = [[Object alloc] init]; 
    [obj excuteSync]; 
    // do something 
    [obj release]; 
}); 

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

+0

Эй ... Я думаю, что это хороший ответ. Никогда не пробовал это. Спасибо. –

0
- (void) delegateMethodReturned: (Object *)obj { 
    [obj release]; 
} 

Однако статический анализатор будет жаловаться, что, так как он думает, что утечка obj в -foo, что вы сделали.

+0

На самом деле именно поэтому я сказал «безопасный» способ выпускать. –

+0

@Mahadevan: нет ничего «небезопасного» в этом подходе. Инструмент имеет известную ложноположительную проблему (проверьте LLVM bugzilla). – 2010-11-11 12:37:28

+0

Это должно работать, если вы можете гарантировать, что метод делегата будет вызван и вызывается только один раз. Я не стал бы верить, что никогда не буду делать изменения, которые приведут к тому, что метод делегата будет вызван более одного раза или вообще не будет. Я бы рекомендовал использовать ivar. –

Смежные вопросы