Пользовательский управляемый объект периодически зависает в средстве доступа - PullRequest
0 голосов
/ 27 апреля 2011

В iOS (с использованием Xcode 4, iPad Simulator 4.3) у меня есть сущность «Article» и сущность «Author». Есть две взаимосвязи, связывающие эти две (статья имеет отношение «авторы» [необязательно, ко-многим], а у автора также есть «статьи» [необязательно, ко-многим]).

Если я начинаю с пустой базы данных (начиная с нуля, удаляя приложение из симулятора и снова нажимая отладку). Он отлично работает, я могу без проблем добавить в базу данных сотни элементов.

НО, если я сначала добавлю некоторые элементы в базу данных, а затем остановлю приложение (нажмите кнопку «Домой» или нет) и начну снова (снова нажмите кнопку отладки), данные есть, я могу «прочитать» данные нормально, и я Можно добавить данные в другие объекты в порядке. Но когда я добавляю новых авторов (а не статей), иногда печать останавливается на второй строке этой функции в моем классе "Author.m" (который является подклассом NSManagedObject):

- (void)addArticlesObject:(Article *)value {    
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];  
    [self willChangeValueForKey:@"articles" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];  
    [[self primitiveValueForKey:@"articles"] addObject:value];  
    [self didChangeValueForKey:@"articles" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];  
    [changedObjects release];  
}

БЕЗ каких-либо сообщений в консоли (вывод отладчика), и если я шагну вперед, меня отправят на __CFTypeCollectionRetain, а затем получат EXC_BADACCESS.

Этот последний шаг не всегда один и тот же, иногда он просто не возвращается, и процессор переходит на 100% (на самом деле 50% - это двухъядерный компьютер), пока я не нажму стоп или не убью процесс "приложения" (xcode отвечает нормально) ,

Есть идеи, что происходит?

Ответы [ 2 ]

1 голос
/ 28 апреля 2011

Вы, вероятно, смотрите на бесконечный цикл, вызванный побочными эффектами двустороннего отношения ко многим, например, когда вы добавляете объект Article к объекту Author, который заставляет объект Article добавить еще один Author экземпляр, который, в свою очередь, добавляет еще Article и т. д. ...

Это не приведет к немедленным ошибкам, поскольку очень длинные циклы часто являются частью кода.Получаемая ошибка говорит о том, что вы столкнулись с некоторой ситуацией переполнения в базовом базовом объекте, который сохраняет объекты коллекции (массивы, словари, наборы).

Проверьте все ваши специальные средства доступа на наличие побочных эффектов, чтобы убедиться, что вы не запускаете петлю.Вы можете поместить операторы журнала в средства доступа, чтобы видеть, когда они вызываются.Это позволит вам увидеть петлю.

0 голосов
/ 23 мая 2011

Кажется, проблема была в том, что пользовательские классы управляемых объектов не синхронизированы с моделью данных. По-видимому, я изменил отношение to-many или необязательное свойство и не восстанавливал пользовательские классы. Теперь проблема исчезла.

...