持久性存储错误的内存管理错误

时间:2011-11-03 00:01:07

标签: ios core-data memory-management

我收到的错误似乎很明显是对已解除分配的对象的消息,但我无法弄清楚我在哪里管理内存错误。这是我创建持久性商店协调员的代码。它基于Core Data应用程序模板。我可能已经改变了一点,但我认为并不多。

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (persistentStoreCoordinator != nil) {
        return persistentStoreCoordinator;
    }

    /* Reminder: in Simulator this is in /Users/<username>/Library/Application Support/iPhone Simulator/User/Applications/<bundleid>/Documents/Wordfare.sqlite */
    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"Wordfare.sqlite"]];

    NSError *error;
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) {
        [persistentStoreCoordinator release];
        persistentStoreCoordinator = nil;
    }    

    return persistentStoreCoordinator;
}

当我从addPersistentStore收到错误时会出现问题,因为我更改了模型,并且我正在尝试打开使用以前的模型创建的商店。当然有一个答案是“不要这样做”。我不会,但我希望代码是健壮的。上面的代码运行没有抱怨,但是当我按下主页按钮时,应用程序崩溃时出现此错误:

  

2011-11-02 16:39:53.751 Wordfare [11137:207] - [__ NSCFArray tryLock]:无法识别的选择器发送到实例0x5a122f0

     

2011-11-02 16:39:53.783 Wordfare [11137:207] * 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [__ NSCFArray tryLock]:无法识别的选择器发送到实例0x5a122f0'

     

* 首次调用堆栈:

     

     

0 CoreFoundation 0x012ed5a9 __exceptionPreprocess + 185

     

1 libobjc.A.dylib 0x01441313 objc_exception_throw + 44

     

2 CoreFoundation 0x012ef0bb - [NSObject(NSObject)doesNotRecognizeSelector:] + 187

     

3 CoreFoundation 0x0125e966 转发 + 966

     

4 CoreFoundation 0x0125e522 _CF_forwarding_prep_0 + 50

     

5 CoreData 0x010d9ef0 - [_ NSSQLCoreConnectionObsever _purgeCaches:] + 112

     

6基金会0x00370669 _nsnote_callback + 145

     

7 CoreFoundation 0x012c59f9 __CFXNotificationPost_old + 745

     

8 CoreFoundation 0x0124493a _CFXNotificationPostNotification + 186

     

9 Foundation 0x0036620e - [NSNotificationCenter postNotificationName:object:userInfo:] + 134

     

10 UIKit 0x0060aa0b - [UIApplication _handleApplicationSuspend:eventInfo:] + 554

     

11 UIKit 0x00614039 - [UIApplication handleEvent:withNewEvent:] + 4127

     

12 UIKit 0x0060babf - [UIApplication sendEvent:] + 71

     

13 UIKit 0x00610f2e _UIApplicationHandleEvent + 7576

     

14 GraphicsServices 0x03851992 PurpleEventCallback + 1550

     

15 CoreFoundation 0x012ce944 CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION + 52

     

16 CoreFoundation 0x0122ecf7 __CFRunLoopDoSource1 + 215

     

17 CoreFoundation 0x0122bf83 __CFRunLoopRun + 979

     

18 CoreFoundation 0x0122b840 CFRunLoopRunSpecific + 208

     

19 CoreFoundation 0x0122b761 CFRunLoopRunInMode + 97

     

20 GraphicsServices 0x038501c4 GSEventRunModal + 217

     

21 GraphicsServices 0x03850289 GSEventRun + 115

     

22 UIKit 0x00614c93 UIApplicationMain + 1160

     

23 Wordfare 0x00002224 main + 102

     

24 Wordfare 0x000021b5 start + 53

     

     

在抛出'NSException'实例后终止调用

抱歉双倍行距。我无法弄清楚格式化。

看起来__NSCFArray在持久存储协调器被释放后发生了移动,但是某些东西仍然有一个指向持久存储的指针并试图调用它的tryLock。

很难说出那是什么。我分配持久性存储协调器,调用addPersistentStore,然后释放它并将其设置为nil。我的代码中没有任何东西可以在该方法之外引用它。我唯一可以想象得到它的引用就是managedObjectModel。我也尝试发布它,但是出现了不同的错误。

如果我注释掉释放persistentStoreCoordinator的行,并将其设置为nil,那么它运行正常,但这可能不对。 persistentStoreCoordinator当然是一个实例变量。我分配了它;如果我放弃对它的引用,我应该释放它。

如何在发生错误后清理持久存储协调器?

附加:我已确认无法识别的选择器被发送到持久性存储协调器的内存地址。

1 个答案:

答案 0 :(得分:0)

不是核心数据的答案,但你应该在启用僵尸的情况下运行(在最近的Xcodes中,只需点击方案的Debug部分中的复选框)。