tableView - message sent to deallocated instance
tableView - message sent to deallocated instance
- Subject: tableView - message sent to deallocated instance
- From: Pax <email@hidden>
- Date: Tue, 25 Feb 2014 20:39:20 +0000
This is a really weird problem (in my view, anyway), because it only occurs in a very particular set of circumstances. My application is NSDocument based (just in case it makes a difference), and my application uses ARC.
I have an NSArray of NSDictionary containing file information, and this is displayed in an NSTableView.
If I open the document and then shut it again without doing anything, all is well. The memory is released as it should be, and the document closes neatly.
If I open the document and then double click on a file in the list, the data in that file is unpacked into a file in my application's cache folder and is then opened (using [[NSWorkspace sharedWorkspace] openFile:filepath];). If I then close the opened file and then close my document, the memory is released as it should be, and the document closes neatly.
If I open the document and then double click on a file in the list, but then close my document **before** closing the newly opened file my application crashes with "message sent to deallocated instance".
I can't for the life of me work out why this crash is happening. My understanding was that, once [[NSWorkspace sharedWorkspace] openFile:filepath] completes the newly opened file is entirely independent of the application or process that spawned it. Am I right in supposing that there's some magic thread which means that my application knows that it has opened a document, and that document hasn't yet been closed? Is there some observer at work here - and, if so, how do I fix it?
The code:
- (void)openAttachmentInViewer:(id)sender
{
@autoreleasepool
{
NSString* filepath;
if ([_attachmentTable selectedRow] < 0 || [_attachmentTable selectedRow] >= [attachmentArray count]) return;
if ([_attachmentTable numberOfSelectedRows] == 1)
{
id record = [attachmentArray objectAtIndex:[_attachmentTable selectedRow]];
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString* pathStem;
//Check for Viewer directory in Caches and create it if it doesn't exist
NSFileManager *fileManager= [NSFileManager defaultManager];
NSError *error = nil;
if(![fileManager createDirectoryAtPath:[NSString stringWithFormat:@"%@/Viewer",[paths objectAtIndex:0]]
withIntermediateDirectories:YES
attributes:nil
error:&error])
{
NSLog(@"Failed to create directory \"%@\". Error: %@ - Cached file saved in general cache folder.",
[NSString stringWithFormat:@"%@/Viewer",[paths objectAtIndex:0]],
error);
pathStem = [paths objectAtIndex:0];
}
else
{
pathStem = [NSString stringWithFormat:@"%@/Viewer",[paths objectAtIndex:0]];
}
filepath = [NSString stringWithFormat:@"%@/%@",pathStem,[record objectForKey:@"name"]];
NSData* thisAttachment = [[NSData alloc] initWithData:[record objectForKey:@"data"]];
[thisAttachment writeToFile:filepath atomically:NO];
[[NSWorkspace sharedWorkspace] openFile:filepath];
}
}
}
All ideas and suggestions welcome!
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden