objective-c - NSNetService 委托(delegate)未被调用

标签 objective-c cocoa bonjour

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

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

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

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

这是奇怪的部分:除非我在“[service resolveWithTimeout:5];”之后运行 NSAlert,否则不会调用任何委托(delegate)方法。有什么想法吗?

最佳答案

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

添加属性:

@property (nonatomic, strong) NSMutableArray *services;

在你的委托(delegate)中,或者任何你使用 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];
}

不要忘记在完成或摆脱委托(delegate)后停止并释放这些服务:

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

关于objective-c - NSNetService 委托(delegate)未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1960378/

相关文章:

objective-c - 当 selectable=YES 时 NSCollectionView 窃取焦点

c++ - avahi:广播我的服务有更新信息

ios - 如果未配置默认邮件应用程序,是否还有其他方法可以从我的IOS应用程序发送电子邮件?

objective-c - QuickLook 插件 : how does it work when 2 plugins handle the same file type?

ios - 如果应用程序从任务管理器中被终止,NSUrlSession 是否继续文件传输?

ios - 使用 Section UITableView 按字母顺序对联系人进行排序

iphone - cocoa touch : Displaying a structured document

ios - NSData的内容是单独引用计数的吗?

ios - Swift:如果我的 iphone 没有连接到我的笔记本电脑,我就看不到所有 bonjour 服务列表

ios - 如何列出本地 WiFi/LAN 网络上的所有共享设备?