Ошибка управления памятью при постоянной ошибке хранилища - PullRequest
2 голосов
/ 03 ноября 2011

Я получаю сообщение об ошибке, которое кажется довольно явным сообщением освобожденному объекту, но я не могу понять, где неправильно управляю памятью. Это мой код для создания постоянного координатора магазина. Он основан на шаблоне приложения 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) делает NotRecognizeSelector:] + 187

3 CoreFoundation 0x0125e966 пересылка + 966

4 CoreFoundation 0x0125e522 _CF_forwarding_prep_0 + 50

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

6 Foundation 0x00370669 _nsnote_callback + 145

7 CoreFoundation 0x012c59f9 __CFXNotificationPost_old + 745

8 CoreFoundation 0x0124493a _CFXNotificationPostNotification + 186

9 Foundation 0x0036620e - [NSNotificationCenter postNotificationName: объект: 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 начало + 53

)

завершить вызов после выброса экземпляра 'NSException'

Извините за двойной интервал. Я не мог понять форматирование.

Похоже, что __NSCFArray перемещается после освобождения координатора постоянного хранилища, но что-то все еще имеет указатель на постоянное хранилище и пытается вызвать его tryLock.

Это действительно трудно сказатьчто это может бытьЯ выделяю координатор постоянного хранилища, вызываю addPersistentStore, затем освобождаю его и устанавливаю в ноль.Ничто в моем коде не могло бы ссылаться на него вне этого метода.Единственное, что я могу себе представить, получая ссылку на него, - это managedObjectModel.Я тоже попытался выпустить его, но с другой ошибкой.

Если я закомментирую строку, которая выпускает persistentStoreCoordinator, и просто установлю ее на nil, тогда она будет работать нормально, но это не может быть правильным.persistentStoreCoordinator, конечно, является переменной экземпляра.Я выделил это;Я должен выпустить его, если я отказываюсь от ссылки на него.

Как я могу очистить координатор постоянного хранилища после ошибки?

Дополнительно: я подтвердил, что нераспознанный селекторотправляется на адрес памяти постоянного координатора хранилища.

1 Ответ

0 голосов
/ 03 ноября 2011

Не ответ Core Data, но вы должны работать с включенными зомби (в последних X-кодах просто установите флажок в части отладки схемы).

...