Objective c 使用圆弧临时保留对象的最佳方法

Objective c 使用圆弧临时保留对象的最佳方法,objective-c,ios,macos,cocoa-touch,cocoa,Objective C,Ios,Macos,Cocoa Touch,Cocoa,非常简短的片段: #pragma mark - NSNetServiceBrowserDelegate - (void)netServiceBrowser:(NSNetServiceBrowser *)netServiceBrowser didFindService:(NSNetService *)netService moreComing:(BOOL)moreServicesComing { netService.delegate = self; [netService re

非常简短的片段:

#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
,直到调用最后一个委托方法?

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

或者换一种方式,通过不维护对对象的强引用,您是在说“我不再对此感兴趣,如果您愿意,请删除它”。

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


或者换一种方式说,通过不保持对对象的强引用,你是在说“我对这个不感兴趣了,如果你愿意,就把它扔掉。”

你为什么不喜欢一个属性的想法?这是很常见的。我喜欢使用
copy
来保留对象,但是@ctrahey是对的,在这里使用属性是正确的。我认为在我的OOP思想中,这个属性是多余的。另外,我希望
netServiceBrowser
会被多次调用,并且
netService
s回调可以按另一个顺序调用,因此引用一个
NSNetService*
属性可能会导致错误状态。这个属性可以是数组,但我仍然相信有更好的东西。但我很乐意解释为什么这个物业解决方案是最好的。但普通并不意味着最好。你为什么不喜欢房产的想法?这是很常见的。我喜欢使用
copy
来保留对象,但是@ctrahey是对的,在这里使用属性是正确的。我认为在我的OOP思想中,这个属性是多余的。另外,我希望
netServiceBrowser
会被多次调用,并且
netService
s回调可以按另一个顺序调用,因此引用一个
NSNetService*
属性可能会导致错误状态。这个属性可以是数组,但我仍然相信有更好的东西。但我很乐意解释为什么这个物业解决方案是最好的。但是common并不一定意味着best。此外,如果您不保留对
NSNetService
的引用,您将无法取消自己作为代理的设置。如果您对服务的生命周期一无所知(其他对象可能会保留对它的另一个引用),那么当服务试图向您发送代理消息时,这很可能会使您的应用程序在
EXC\u BAD\u ACCESS
下崩溃。这就是为什么您应该在类中为自己设置为委托的所有对象执行
-setDelegate:nil
。当然,唯一可以做到这一点的方法是保留对这些对象的引用。此外,如果不保留对
NSNetService
的引用,您将无法取消自己作为代理的设置。如果您对服务的生命周期一无所知(其他对象可能会保留对它的另一个引用),那么当服务试图向您发送代理消息时,这很可能会使您的应用程序在
EXC\u BAD\u ACCESS
下崩溃。这就是为什么您应该在类中为自己设置为委托的所有对象执行
-setDelegate:nil
。当然,实现这一点的唯一方法是保留对这些对象的引用。