首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未调用NSNetService委托

未调用NSNetService委托
EN

Stack Overflow用户
提问于 2009-12-25 11:15:07
回答 3查看 5.5K关注 0票数 12

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

代码语言:javascript
复制
NSNetService *service = [[NSNetService alloc] initWithDomain:@"local." type:@"_daap._tcp" name:@"My_Mac"];
[service setDelegate:self];
[service resolveWithTimeout:5];

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

代码语言:javascript
复制
- (void)netServiceDidResolveAddress:(NSNetService *)sender
- (void)netService:(NSNetService *)sender didNotResolve:(NSDictionary *)errorDict

奇怪的是:除非我在"service resolveWithTimeout:5;“之后运行NSAlert,否则这两个委托方法都不会被调用。有什么想法吗?

EN

回答 3

Stack Overflow用户

发布于 2013-04-21 19:15:19

如果您正在使用ARC,则需要将服务对象保留在某个位置。在您的示例中,服务对象很可能超出了作用域,并且在代码中的其他任何地方都没有被引用,因此编译器将在resolve调用后立即尝试释放它。

添加属性:

代码语言:javascript
复制
@property (nonatomic, strong) NSMutableArray *services;

在委托中,或在使用NSNetService的任何地方

代码语言:javascript
复制
- (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];
}

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

代码语言:javascript
复制
for (NSNetService* service in self.services) {
    [service stop];
}
[self.services removeAllObjects];
票数 31
EN

Stack Overflow用户

发布于 2009-12-25 13:21:42

我不确定,但看起来由于某种原因,请求实际上并没有被安排在run循环中。也许可以尝试像this这样的东西来安排它?

代码语言:javascript
复制
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协议,还是只有这些方法?

编辑:我有另一个想法,这可能是某种竞争条件(更有可能的情况)。委托通常是弱引用。如果您的对象退出作用域并被自动释放,系统将以nil句柄结束,并将消息激发为nil。在显示NSAlert (或执行其他工作)的情况下,您的对象可能会停留足够长的时间,以便将激发的消息返回给它。你能确认你的物体停留了整整8秒吗?

票数 10
EN

Stack Overflow用户

发布于 2018-10-14 18:25:51

我刚刚遇到了这个问题,我已经保留了NSNetService对象,所以这不是原因。

事实证明,这是因为我定义的委托方法的访问级别与class的访问级别不匹配( classpublic,而委托方法是internal)。因为所有的委托方法都是可选的,所以编译器只是给出了一个无声的警告。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1960378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档