• iOS: crush when save Core Data


    如果一个页面拥有一个 NSFetchedResultsController 的引用,那么在这个界面将要结束时,一定要 remove 它的 observer

    - (void)dealloc {
        //...
        [[NSNotificationCenter defaultCenter] removeObserver:self.fetchedResultsController];
        _fetchedResultsController.delegate = nil;
        [_fetchedResultsController release];
        [super dealloc];
    }

    为什么呢?

    看下崩溃日志(友盟统计捕获的崩溃日志)

    2014-03-26 17:39:17.128 XiaoJiZhuoMi[13394:90b] Umeng: -[UIButton controllerWillChangeContent:]: unrecognized selector sent to instance 0xce92db0
    (null)
    (
        0   CoreFoundation                      0x01daa1e4 __exceptionPreprocess + 180
        1   libobjc.A.dylib                     0x041fb8e5 objc_exception_throw + 44
        2   CoreFoundation                      0x01e47243 -[NSObject(NSObject) doesNotRecognizeSelector:] + 275
        3   CoreFoundation                      0x01d9a50b ___forwarding___ + 1019
        4   CoreFoundation                      0x01d9a0ee _CF_forwarding_prep_0 + 14
        5   CoreData                            0x03fda640 -[NSFetchedResultsController(PrivateMethods) _managedObjectContextDidChange:] + 2080
        6   Foundation                          0x0395b049 __57-[NSNotificationCenter addObserver:selector:name:object:]_block_invoke + 40
        7   CoreFoundation                      0x01e05f04 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 20
        8   CoreFoundation                      0x01d5defb _CFXNotificationPost + 2859
        9   Foundation                          0x03894e41 -[NSNotificationCenter postNotificationName:object:userInfo:] + 98
        10  CoreData                            0x03edda13 -[NSManagedObjectContext(_NSInternalNotificationHandling) _postObjectsDidChangeNotificationWithUserInfo:] + 83
        11  CoreData                            0x03f7cfaf -[NSManagedObjectContext(_NSInternalChangeProcessing) _createAndPostChangeNotification:withDeletions:withUpdates:withRefreshes:] + 367
        12  CoreData                            0x03ed8eb8 -[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] + 2152
        13  CoreData                            0x03edc2fc -[NSManagedObjectContext save:] + 140
    
    ...

    当 [NSManagedObjectContext save:] 后,会发送一个通知,这时与之绑定的 NSFetchedResultsController,拿到通知后,负责给它的代理更新页面(或其他)。而如果持有 NSFetchedResultsController 的页面已经被销毁,及 NSFetchedResultsController 已经被 release,那么它收到通知会怎么办?只有崩溃(如崩溃日志第一行所示)。

  • 相关阅读:
    [古城子的房子] 贪心
    [小兔的棋盘] 组合数学
    [Triangle] Fibonacci+二分查找
    [Fibonacci] 矩阵快速幂
    [DP?]素数筛+Lucas定理+费马小定理
    react本地开发关闭eslint检查
    react 不同js文件里公用同一个变量
    js学习笔记
    node内存扩展,前端项目运行时报内存不足的错误
    Gitee码云通过WebHooks实现自动同步代码部署
  • 原文地址:https://www.cnblogs.com/ihojin/p/crush-when-save-coredata.html
Copyright © 2020-2023  润新知