Я получаю сообщение об ошибке, которое кажется довольно явным сообщением освобожденному объекту, но я не могу понять, где неправильно управляю памятью. Это мой код для создания постоянного координатора магазина. Он основан на шаблоне приложения 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, конечно, является переменной экземпляра.Я выделил это;Я должен выпустить его, если я отказываюсь от ссылки на него.
Как я могу очистить координатор постоянного хранилища после ошибки?
Дополнительно: я подтвердил, что нераспознанный селекторотправляется на адрес памяти постоянного координатора хранилища.