:发送到解除分配的实例的消息

当我从History Core Data对象中记录/请求值时,以下代码返回以下错误:

-[CFNumber release]: message sent to deallocated instance 0x17ea2a90 

我原本以为其他地方有一个问题,并花了无数个小时试图调试这个没有运气。 在进一步测试之后,我已经确定崩溃是从History Core Data对象请求某些值。 任何人都可以看到对象值被解除分配的原因吗?

  [[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 }]; }]; }]; }]; 

启用了exception断点的更多日志:

  (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 

根据过渡到ARC发行说明 :

为了允许与手动保留释放代码进行互操作,ARC对方法命名施加了约束:

  • 您不能为访问者提供以new开头的名称。 这反过来意味着你不能,例如,声明一个名称以new开头的属性,除非你指定一个不同的getter:

      // Won't work: @property NSString *newTitle; // Works: @property (getter=theNewTitle) NSString *newTitle; 

最后,假设以new开头的方法返回ARC负责管理和释放的对象(但这不是这种情况)。 我建议只是改变你的属性,以便它不会以new开头以避免任何混淆。