实现异步委托方法的正确方法

时间:2010-11-11 12:01:27

标签: iphone objective-c design-patterns asynchronous delegates

考虑以下情况。

-(void) foo {

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

    obj.delegate = self;

    [obj excuteAsync];
}

-(void) delegateMethodReturned {
    // do something
}

这里executeAync会在某段时间后异步返回。因此我们无法安全地释放obj。在没有将obj声明为iVar的情况下实现这种情况的最佳设计模式是什么。

由于

2 个答案:

答案 0 :(得分: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];
});

我发现这在某些情况下有帮助,但您的里程可能会有所不同。

答案 1 :(得分:0)

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

然而,静态分析器会抱怨这一点,因为它认为你在obj中泄露了-foo,你做了。