我在DNS.h中有这个课程
@interface DNS : NSObject <NSXMLParserDelegate, NSNetServiceDelegate> {
NSMutableArray *servsPublished;
}
@property(nonatomic, retain) NSMutableArray *servsPublished;
然后在实现文件DNS.m中有一个方法,我释放它,我得到exec坏访问内存错误。这是方法,它符合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,然后释放它。
它与retain属性有关吗? 谢谢。
答案 0 :(得分:1)
不要在for循环中释放aService。你没有在这里创建它们(没有alloc / new / copy)所以你不应该释放它们。当您发布servToPublish时,所有内容都将自动释放,但如果您在循环中释放它们,则会导致发送过多的发布消息。
在这种情况下释放client
是正确的,因为你确实已经分配了它。
答案 1 :(得分:0)
首先,运行构建和分析。静态分析器非常擅长指出某些类型的内存管理问题。
其次,除非您处于dealloc,否则您可能不希望直接在servsPublished上调用release。相反,请使用self.servsPublished = nil
。这将正确释放对象并将相应的ivar设置为nil。