2009-12-25 62 views
11

我试图解决NSNetService(名为“My_Mac”)为IP与该代码后台程序:NSNetService代表没有被调用

NSNetService *service = [[NSNetService alloc] initWithDomain:@"local." type:@"_daap._tcp" name:@"My_Mac"]; 
[service setDelegate:self]; 
[service resolveWithTimeout:5]; 

而且在同一个班级,我有这方面的代表方法定义:

- (void)netServiceDidResolveAddress:(NSNetService *)sender 
- (void)netService:(NSNetService *)sender didNotResolve:(NSDictionary *)errorDict 

这里的怪部分:既不委托方法被调用,除非我以后运行NSAlert“[服务resolveWithTimeout:5];”。有任何想法吗?

回答

9

我不确定,但它看起来像请求实际上没有安排在运行循环出于某种原因。也许尝试像this来安排它?

NSNetService *service = [[[NSNetService alloc] initWithDomain:@"local." type:@"_daap._tcp." name:@"My_Mac"] autorelease]; 
[service setDelegate:self]; 
[service scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:@"PrivateMyMacServiceMode"]; 
[service resolveWithTimeout:8.0]; 

愚蠢的问题,但你明确实施NSServiceDelegate协议或只是有方法?

编辑:我有另一个想法,这可能是某种竞争条件(更可能的场景)。代表通常是弱引用。如果你的对象正在退出范围并被自动释放,那么系统最终会得到一个零句柄并且将消息发送到零。在你显示NSAlert(或者做其他工作)的情况下,你的对象可能只是停留在足够长的时间,以便让消息被触发回去。你能否确认你的物体在整个8秒钟内保持不动?

+0

感谢您的回复slf。我试过你的NSRunLoop代码,但没有骰子。因为我的目标是10.5,所以没有定义正式的NSServiceDelegate协议。 – 2009-12-26 02:21:25

+2

slf:你是对的 - 我关掉GC以确保物体仍然存在,并且代表们被呼叫。现在我只需要追踪它在哪里被自动发布,因为我已经明确地尝试保留它,而这并不起作用。感谢您指点我正确的方向! – 2009-12-26 22:26:14

+0

看起来复杂的问题的解决方案通常比你第一次想到的要简单:) – slf 2009-12-29 17:34:37

23

如果您使用ARC,则需要在某处保留服务对象。 在你的例子中,服务对象很可能超出了作用域,并且在你的代码的其他地方没有被引用,所以编译器会在解析调用之后立即尝试释放它。

添加一个属性:

@property (nonatomic, strong) NSMutableArray *services; 

在您的委托,或任何你使用NSNetService

- (void)netServiceBrowser:(NSNetServiceBrowser *)browser 
      didFindService:(NSNetService *)aNetService 
       moreComing:(BOOL)moreComing 
{ 
    if (!self.services) { 
     self.services = [[NSMutableArray alloc] init]; 
    } 
    [self.services addObject:aNetService]; 
    [aNetService setDelegate:self]; 
    [aNetService resolveWithTimeout:3.0]; 
} 

不要忘了停下来释放这些服务一旦你完成或摆脱代表:

for (NSNetService* service in self.services) { 
    [service stop]; 
} 
[self.services removeAllObjects]; 
+0

这对我有效! – joshblour 2015-02-14 10:21:56

+0

保留它的作品。但NSNetServiceDelegate方法签名中的NSNetService参数是否保留该对象?例如**发件人**在 - (无效)netServiceDidResolveAddress:(NSNetService *)发件人 – snowbound 2015-10-02 04:00:10