使用ARC暂时保留对象的最佳方法

时间:2012-06-21 20:56:07

标签: objective-c ios macos cocoa-touch cocoa

非常简短的片段:

#pragma mark - NSNetServiceBrowserDelegate

- (void)netServiceBrowser:(NSNetServiceBrowser *)netServiceBrowser didFindService:(NSNetService *)netService moreComing:(BOOL)moreServicesComing
{
    netService.delegate = self;
    [netService resolveWithTimeout:30];
}

在此示例中,在同一事件循环中调用- netServiceWillResolve:。然后,netService被释放(因为ARC)并且没有机会被召唤。

我不喜欢ivar的解决方案。 NSNetService *既不是数组。有没有更好的方法来“保留”netService,直到调用最后一个委托方法?

1 个答案:

答案 0 :(得分:4)

documentation明确表示代理未被保留,这是Cocoa中的正常模式。此外,resolveWithTimeout:上的文档没有说明在调用委托方法之前保留的NSNetService。在正常的内存管理规则下(我认为这也适用于ARC),您不能对该方法范围之外的该对象的生命周期做出任何假设。

或者换句话说,通过不保持对象的强引用,你说“我对此不再感兴趣,如果你喜欢就废除它。”