2010-10-15 64 views
0

我有這個類DNS.hObjective-C的釋放

@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]; 
} 

也許首先想到的是零,但實際上我使用它的方法檢查是否是零或不是裏面,然後釋放它。

它與保留屬性有關嗎? THX。

+1

發佈nil不會產生問題 - 顯然你可以發送任何消息給nil。你可以在你初始化的地方發佈代碼,以及你在哪裏發佈你的servsPublished變量? – Vladimir 2010-10-15 21:37:16

+0

顯示你在哪裏發佈「it」的代碼 – 2010-10-15 21:37:51

+2

@Robot,是的,我說過不同的東西嗎? – Vladimir 2010-10-15 21:47:54

回答

0

首先,運行構建和分析。靜態分析器非常擅長指出某些類型的內存管理問題。

其次,除非你在dealloc中,否則你可能不想直接在servsPublished上調用release。相反,使用self.servsPublished = nil。這將適當地釋放對象並將相應的伊娃設置爲零。

1

不要在for循環中釋放服務。你還沒有創建它們(沒有分配/新/複製),所以你不應該釋放它們。當您釋放servToPublish時,所有內容將自動釋放,但如果您在循環中釋放它們,則會導致發送太多釋放消息。

在這種情況下,您確實分配client是正確的。