The code below returns the following error when I log/request values from the History Core Data object:
-[CFNumber release]: message sent to deallocated instance 0x17ea2a90
I originally thought there was an issue elsewhere and have spent countless hours attempting to debug this to no luck. After further testing, I have pinpointed the crash to requesting certain values from the History Core Data object. Can anyone see any issues to why the object values are being deallocated?
[[DocumentHandler sharedDocumentHandler] performWithDocument:^(UIManagedDocument *document) {
if(!self.document) {
self.document = document;
}
__block NSString *identifier = [[NSUserDefaults standardUserDefaults] objectForKey:kUserDefaultsUserIdentifier];
[self.document.managedObjectContext performBlock:^{
// Create history object
History *history = [NSEntityDescription insertNewObjectForEntityForName:@"History"
inManagedObjectContext:self.document.managedObjectContext];
history.identifier = identifier;
history.followers = [NSNumber numberWithInteger:53];
history.following = [NSNumber numberWithInteger:53];
history.newFollowers = [NSNumber numberWithInteger:53];
history.unfollowers = [NSNumber numberWithInteger:53];
history.fans = [NSNumber numberWithInteger:53];
history.mutualFriends = [NSNumber numberWithInteger:53];
history.nonFollowers = [NSNumber numberWithInteger:53];
[self.document saveToURL:self.document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:^(BOOL success) {
// Fetch previous records
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"History"];
request.predicate
= [NSPredicate predicateWithFormat:@"identifier == %@", identifier];
NSError *error = nil;
NSArray *records = [self.document.managedObjectContext executeFetchRequest:request error:&error];
[records enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"%@", [(History *)obj newFollowers]); // Crash takes place here
}];
}];
}];
}];
More logs with an exception breakpoint enabled:
(lldb) bt
* thread #1: tid = 0x28b70, 0x3b5787fa libobjc.A.dylib`objc_release + 10, queue = 'com.apple.main-thread, stop reason = EXC_BAD_ACCESS (code=1, address=0x10)
frame #0: 0x3b5787fa libobjc.A.dylib`objc_release + 10
frame #1: 0x3b578022 libobjc.A.dylib`(anonymous namespace)::AutoreleasePoolPage::pop(void*) + 358
frame #2: 0x311b4298 CoreFoundation`_CFAutoreleasePoolPop + 16
frame #3: 0x3127533e CoreFoundation`__NSArrayEnumerate + 614
frame #4: 0x31216012 CoreFoundation`-[NSArray enumerateObjectsWithOptions:usingBlock:] + 62
frame #5: 0x000eae26 Twitter Followers`__71-[MainViewController updateCurrentRecordAndTableHeaderForUpdateAction:]_block_invoke_2(.block_descriptor=0x15e58080, success='\x01') + 678 at MainViewController.m:671
frame #6: 0x3ba65bea libdispatch.dylib`_dispatch_barrier_sync_f_slow_invoke + 66
frame #7: 0x3ba600ee libdispatch.dylib`_dispatch_client_callout + 22
frame #8: 0x3ba629a8 libdispatch.dylib`_dispatch_main_queue_callback_4CF + 268
frame #9: 0x3124b5b8 CoreFoundation`__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 8
frame #10: 0x31249e84 CoreFoundation`__CFRunLoopRun + 1308
frame #11: 0x311b4540 CoreFoundation`CFRunLoopRunSpecific + 524
frame #12: 0x311b4322 CoreFoundation`CFRunLoopRunInMode + 106
frame #13: 0x35eeb2ea GraphicsServices`GSEventRunModal + 138
frame #14: 0x33a6b1e4 UIKit`UIApplicationMain + 1136
According to the Transitioning to ARC Release Notes:
To allow interoperation with manual retain-release code, ARC imposes a constraint on method naming:
You cannot give an accessor a name that begins with
new
. This in turn means that you can’t, for example, declare a property whose name begins withnew
unless you specify a different getter:// Won't work: @property NSString *newTitle; // Works: @property (getter=theNewTitle) NSString *newTitle;
Bottom line, methods that start with new
are assumed to return an object that ARC is responsible for managing and releasing (but this isn't the case here). I'd suggest just changing your property so that it doesn't start with new
to avoid any confusion.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With