цель-релиз - PullRequest
       25

цель-релиз

0 голосов
/ 16 октября 2010

У меня есть этот класс в DNS.h

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

Затем в файле реализации DNS.m есть метод, где я освобождаю его и получаю ошибку памяти exec bad access.Это метод, он соответствует протоколу 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];
}

Возможно, первая мысль, что это ноль, но на самом деле я использую его внутри метода, проверяя, является ли ноль или нет, и затем освобождаю его.

Имеет ли это какое-то отношение к свойству retain?СПАСИБО.

Ответы [ 2 ]

1 голос
/ 19 октября 2010

НЕ освобождайте aService в цикле for. Вы не создали их здесь (без alloc / new / copy), поэтому не следует их выпускать.Когда вы освобождаете servToPublish, весь контент будет автоматически освобожден, но если вы освободите их в цикле, вы вызовете отправку слишком большого количества сообщений о выпуске.это.

0 голосов
/ 16 октября 2010

Сначала запустите build и проанализируйте. Статический анализатор довольно хорошо показывает некоторые типы проблем управления памятью.

Во-вторых, если вы не в dealloc, вы, вероятно, не хотите вызывать release непосредственно на servsPublished. Вместо этого используйте self.servsPublished = nil. Это правильно освободит объект и установит для соответствующего ивара ноль.

...