5

当我从 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
            }];

        }];

    }];

}];

启用了异常断点的更多日志:

    (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
4

1 回答 1

22

根据过渡到 ARC 发行说明

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

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

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

最重要的是,假设以开头的方法new返回一个由 ARC 负责管理和释放的对象(但这里不是这种情况)。我建议只是改变你的财产,这样它就不会开始new以避免任何混乱。

于 2013-10-19T19:42:11.707 回答