2011-01-27 3 views
0

Я сохранил код как можно проще. И включил только то, что действительно необходимо для того, чтобы приложение функционировало так, как нужно.Приложение сбой при попытке и освобождении объекта

Но я все еще получаю сбой, который я не могу объяснить. Сообщение об ошибке отсутствует. Он появился, когда я добавил строку [parser release];

Парсер, который является объектом XMLParser, сбрасывается, когда я освобождаюсь, происходит, даже если его локально выделено и выпущено, или если я сделаю его переменной-членом и выпустят в методе dealloc.

Вот код маленького класса его использовали в.

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 

@class WebServiceAPI, RadioAppDelegate, XMLParser; 
@interface WebServiceAPI : NSObject 
{ 
    XMLParser *parser; 
    FootballRadioAppDelegate *appDelegate; 
} 
@end 


#import "WebServiceAPI.h" 
#import "XMLParser.h" 

@implementation WebServiceAPI 

-(void) getRadioStationList//:(id) aDelegate; 
{ 
    NSURL *url = [[NSURL alloc] initWithString:@"http://bdoyle.kingpinhosting.com/Radios.xml"]; 
    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 
    [url release]; 
    parser = [[XMLParser alloc] initXMLParser]; 
    [xmlParser setDelegate:parser]; 
    [xmlParser parse]; 

    [xmlParser release]; 
    xmlParser = nil;  
} 
- (void) connectionDidFinishLoading:(NSURLConnection*)connection 
{ 
} 

- (void) connection:(NSURLConnection*) connection didFailWithError:(NSError*) error 
{ 
} 

-(void) dealloc 
{ 
    [parser release]; 
    parser = nil; 
    [super dealloc]; 
} 
@end 

Если я оставить код без вызова к высвобождению «парсер», то он работает отлично. Но, очевидно, это утечка памяти.

+0

Не называть методы «get *», если вы не получаете ощущение Cocoa/iOS, которое вы здесь не делаете. Конвенция будет просто «radioStationList». – bbum

+0

Спасибо. –

ответ

0

Вы можете попытаться проверить, является ли есть выделить память на объекте с помощью

NSLog (@ "выделения парсер% D", [анализатор retainCount])

и попытаться пустой делегат

[парсер setDelegate: ноль]

надеюсь, что это поможет.

1

Вы выпускаете парсер в методе getRadioStationList и не назначаете его нулевому значению. Затем на dealloc класса вы выпускаете его снова.

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

+0

был опечаткой. Извините насчет путаницы –

1

Похоже, вы выпускаете парсер дважды; один раз в dealloc и один раз в getRadioStationList.

+0

Это опечатка! Извини за это. –

0

Если parser является переменной экземпляра, прокомментированный release в radioStationList был бы неправильным. Это не было бы утечкой, предполагая, что вы хотите, чтобы синтаксический анализатор выжил до dealloc.

Если XMLParser следит за стандартный delegate шаблоном, то он не будет сохранять parser и, таким образом, что release, скорее всего, приведет к чрезмерному выпуску или аварии позже.

Там должно быть трассировку, если вы врезаться. Или журнал сбоев. Отправьте его, пожалуйста. Кроме того, попробуйте запустить с включенными Zombies и посмотреть, получаете ли вы дополнительную информацию.

+0

ОК. Спасибо за эти моменты. Можем ли мы игнорировать опечатку с этого момента. –

Смежные вопросы