【问题标题】:objective-c releaseObjective-C 发布
【发布时间】:2010-10-15 21:34:54
【问题描述】:

我在 DNS.h 中有这个类

@interface DNS : NSObject <NSXMLParserDelegate, NSNetServiceDelegate> {
     NSMutableArray *servsPublished;
}
@property(nonatomic, retain) NSMutableArray *servsPublished;

然后在实现文件 DNS.m 中有一个方法可以释放它,我得到 exec bad access memory 错误。这是方法,它符合 NSXMLParserDelegate 协议

-(void) parserDidEndDocument:(NSXMLParser *)parser {
    NSNetService *client;
    for (NSDictionary *aService in servToPublish) {
        client = [[NSNetService alloc] initWithDomain:@"local" 
                                             type:[aService objectForKey:@"serviceType"] 
                                             name:[aService objectForKey:@"name"] 
                                             port: [(NSNumber *)[aService objectForKey:@"port"] intValue]];

        [client setDelegate: self];
        [client publish];

        //release this service and the client
       [aService release];
       //[client release];
   }

   //free the array of Dictionary containing the services
   [servToPublish release];
}

也许第一个想法是nil,但实际上我在方法中使用它检查是否为nil,然后释放它。

它与保留属性有关吗? 谢谢。

【问题讨论】:

  • 释放 nil 不会有问题——显然你可以向 nil 发送任何消息。您能否在初始化和释放 servsPublished 变量的位置发布代码?
  • 显示你发布“it”的代码
  • @Robot,是的,我说了什么不同的东西吗?
  • 你没有。我误读了你的评论。对不起。
  • 我刚刚用释放 servToPublish 属性的方法编辑了我的问题

标签: objective-c release release-management retaincount


【解决方案1】:

不要在 for 循环中释放服务。你没有在这里创建它们(没有 alloc/new/copy)所以你不应该释放它们。当您发布 servToPublish 时,所有内容都会自动发布,但如果您在循环中发布它们,则会导致发送的发布消息过多。

在这种情况下释放client 是正确的,因为你确实分配它。

【讨论】:

    【解决方案2】:

    首先,运行构建和分析。静态分析器非常擅长指出某些类型的内存管理问题。

    其次,除非您处于 dealloc 中,否则您可能不想直接在 servsPublished 上调用 release。相反,请使用self.servsPublished = nil。这将正确释放对象并将相应的 ivar 设置为 nil。

    【讨论】:

      猜你喜欢
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多