EXC_BAD_ACCESS quando fecho minha janela, que também é delegada do meu aplicativo
Eu escrevi um pedido de cacau e recebiEXC_BAD_ACCESS
erro ao fechar uma janela do aplicativo. Eu li que esse erro geralmente significa problemas de memória, mas eu tenhoARC mode
on e não preciso me preocupar em liberar e.t.c. (O xCode me proíbe de chamar essas funções e gerenciar a memória automaticamente
Error está apontando para a linhareturn NSApplicationMain(argc, (const char **)argv);
na função principal.
Aqui está o código do meu aplicativo:
arquivo .h:
@interface MainDreamer : NSWindow <NSWindowDelegate>
{
NSTextField *dreamField;
NSTableView *dreamTable;
NSImageView *dreamview;
NSMutableArray *dreamlist;
NSMutableArray *dataset;
}
@property (nonatomic, retain) IBOutlet NSTextField *dreamField;
@property (nonatomic, retain) IBOutlet NSTableView *dreamTable;
@property (nonatomic, retain) IBOutlet NSImageView *dreamview;
@property (nonatomic, retain) IBOutlet NSMutableArray *dreamlist;
@property (nonatomic, retain) IBOutlet NSMutableArray *dataset;
@property (assign) IBOutlet NSWindow *window;
@end
arquivo .m:
@implementation MainDreamer
@synthesize window;
@synthesize dataset;
@synthesize dreamField;
@synthesize dreamlist;
@synthesize dreamview;
@synthesize dreamTable;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification{
NSString *applicationPath = [[NSBundle mainBundle] bundlePath];
NSString *filename = [applicationPath stringByAppendingPathComponent:@"dreams"];
NSLog(self.description);
dreamlist = [[NSMutableArray alloc] init];
dataset = [[NSMutableArray alloc] init];
dataset = [NSKeyedUnarchiver unarchiveObjectWithFile:filename];
if([dataset count] != 0) {
int i = 0;
while (i < [dataset count]) {
Dream *dr = [[Dream alloc] init];
dr = [dataset objectAtIndex:i];
[dreamlist addObject: dr.dreamname];
i++;
}
}
[dreamTable reloadData];
}
-(void)applicationWillTerminate:(NSNotification *)notification{
NSString *applicationPath = [[NSBundle mainBundle] bundlePath];
NSString *filename = [applicationPath stringByAppendingPathComponent:@"dreams"];
[NSKeyedArchiver archiveRootObject:dataset toFile:filename];
NSLog(@"finish");
}
- (void) mouseUp:(NSEvent *)theEvent{
long index = [dreamTable selectedRow];
Dream *dr = [[Dream alloc] init];
dr = [dataset objectAtIndex:index];
dr.dreampicture = dreamview.image;
[dataset replaceObjectAtIndex:index withObject:dr];
NSLog(self.description);
}
- (void) tableViewSelectionDidChange: (NSNotification *) notification{
long row = [dreamTable selectedRow];
Dream *dr = [[Dream alloc] init];
dr = [dataset objectAtIndex: row];
if(dr.dreampicture != NULL)
dreamview.image = dr.dreampicture;
NSLog(@"selected row changed");
}
Class "Dream":
@interface Dream : NSObject <NSCoding>
{
NSString *dreamname;
NSImage *dreampicture;
}
@property (retain) NSString* dreamname;
@property (retain) NSImage* dreampicture;
-(id)initWithCoder:(NSCoder *)aDecoder;
-(void)encodeWithCoder:(NSCoder *)aCoder;
@end
O que está errado, por queEXC_BAD_ACCESS
embro que tenho o xCode 4 com a contagem automática de referência (ARC)
Obrigad
ATUALIZA
Eu usei o Profile para encontrar um evento zumbi. Então eu descobri isso:Uma mensagem Objective-C foi enviada para um objeto desalocado (zombie (no endereço 0x108d85230)
Responsible Caller -[NSApplication(NSWindowCache) _checkForTerminateAfterLastWindowClosed: saveWindows:]
Eu tinha essa função no código:
- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender{
return TRUE;
}
No entanto, depois que eu o coloquei nos comentários, esse evento de zumbi continuará ocorrend