NSNetService委托没有被调用

K_T*_*K_T 11 cocoa bonjour objective-c

我正在尝试使用以下代码将NSNetService(名为"My_Mac")解析为后台应用程序中的IP:

NSNetService *service = [[NSNetService alloc] initWithDomain:@"local." type:@"_daap._tcp" name:@"My_Mac"];
[service setDelegate:self];
[service resolveWithTimeout:5];
Run Code Online (Sandbox Code Playgroud)

在同一个类中,我定义了这些委托方法:

- (void)netServiceDidResolveAddress:(NSNetService *)sender
- (void)netService:(NSNetService *)sender didNotResolve:(NSDictionary *)errorDict
Run Code Online (Sandbox Code Playgroud)

这是一个奇怪的部分:除非我在"[service resolveWithTimeout:5];"之后运行NSAlert,否则不会调用委托方法.有任何想法吗?

uto*_*lex 25

如果您使用ARC,则需要在某处保留服务对象.在您的示例中,服务对象很可能超出范围,并且未在代码中的任何其他位置引用,因此编译器将尝试在解析调用后立即释放它.

添加属性:

@property (nonatomic, strong) NSMutableArray *services;
Run Code Online (Sandbox Code Playgroud)

在您的代理中,或在您使用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];
}
Run Code Online (Sandbox Code Playgroud)

完成或删除代表后,不要忘记停止并释放这些服务:

for (NSNetService* service in self.services) {
    [service stop];
}
[self.services removeAllObjects];
Run Code Online (Sandbox Code Playgroud)


slf*_*slf 9

我不确定,但看起来请求实际上并没有因为某种原因在运行循环中进行调度.也许尝试像这样安排呢?

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];
Run Code Online (Sandbox Code Playgroud)

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

编辑:我有另一种想法,这可能是某种竞争条件(更可能的情况).代表们通常都是弱参考.如果您的对象超出范围并被自动释放,系统将以nil句柄结束并将消息触发为nil.在您展示NSAlert(或做其他工作)的情况下,您的对象可能会闲置很长时间,以便将消息反射回来.你可以确认你的物体持续整整8秒吗?

  • slf:你是对的 - 我关闭了GC以确保对象仍在那里,并且代表们被调用了.现在我只需要追踪它被自动释放的位置,因为我已经明确地试图保留它,但这不起作用.谢谢你指点我正确的方向! (2认同)