Правильный способ реализации Aysnchronous Delegate Methods - PullRequest
1 голос
/ 11 ноября 2010

Рассмотрим следующую ситуацию.

-(void) foo {

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

    obj.delegate = self;

    [obj excuteAsync];
}

-(void) delegateMethodReturned {
    // do something
}

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

Спасибо

Ответы [ 2 ]

1 голос
/ 11 ноября 2010

Если вы можете ориентироваться на 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 голосов
/ 11 ноября 2010
- (void) delegateMethodReturned: (Object *)obj {
  [obj release];
}

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

...