[CFNumber release]:发送到解除分配的实例的消息 [英] [CFNumber release]: message sent to deallocated instance

查看:164
本文介绍了[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 开头的属性,除非你指定一个不同的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;


Bottom一行,以 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天全站免登陆