[CFNumber release]: 发送给已释放实例的消息 [英] [CFNumber release]: message sent to deallocated instance

查看:16
本文介绍了[CFNumber release]: 发送给已释放实例的消息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

我最初认为其他地方存在问题,并且花了无数小时试图调试它,但没有成功.经过进一步测试,我已经确定崩溃是从 History Core Data 对象请求某些值.任何人都可以看到为什么对象值被释放的任何问题吗?

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

推荐答案

根据过渡到 ARC 发行说明:

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

To allow interoperation with manual retain-release code, ARC imposes a constraint on method naming:

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

  • 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 with new unless you specify a different getter:

    // Won't work:
    @property NSString *newTitle;

    // Works:
    @property (getter=theNewTitle) NSString *newTitle;

底线,以 new 开头的方法被假定返回一个 ARC 负责管理和释放的对象(但这里不是这种情况).我建议只更改您的属性,使其不以 new 开头以避免任何混淆.

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.

这篇关于[CFNumber release]: 发送给已释放实例的消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆