0

DNS.hにこのクラスがあります

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

次に、実装ファイルDNS.mに、それを解放するメソッドがあり、exec badaccessmemoryエラーが発生します。これはメソッドであり、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プロパティと関係がありますか?THX。

4

2 に答える 2

1

for ループで aService を解放しないでください。ここでそれらを作成していない (割り当て/新規/コピーなし) ため、それらを解放しないでください。servToPublish を解放すると、すべてのコンテンツが自動的に解放されますが、ループ内でそれらを解放すると、あまりにも多くの解放メッセージが送信されます。

clientこの場合、割り当てているので解放するのが正しいです。

于 2010-10-18T20:52:53.267 に答える
0

まず、ビルドと分析を実行します。静的アナライザーは、特定の種類のメモリ管理の問題を指摘するのに非常に優れています。

第 2 に、dealloc を使用していない限り、servsPublished で release を直接呼び出したくないでしょう。代わりに、を使用してself.servsPublished = nilください。これにより、オブジェクトが適切に解放され、対応する ivar が nil に設定されます。

于 2010-10-15T21:43:28.353 に答える