передача NSManagedObjects между ViewControllers - случайные ошибки неправильного доступа - PullRequest
3 голосов
/ 02 декабря 2010

Является ли передача NSManagedObjects между ViewControllers плохой идеей?У меня есть приложение для iPad, и я, кажется, сталкиваюсь со случайными неудачными сбоями доступа и ошибками sigbart.

Эти NSManageObjects происходят из CoreData, и мне интересно, иногда они просто выпадают из памяти и вызывают это.Я надеялся просто передать их от контроллера к контроллеру, чтобы избежать выборки для каждого viewcontroller.

Ответы [ 3 ]

6 голосов
/ 02 декабря 2010

Звучит так, будто дело в плохих методах выделения памяти для объектов.Пока вы не используете многопоточность своего приложения и существует только один managedObjectContext (типичный), вы можете без проблем передавать эти NSManagedObjects между VeiwControllers.

Вероятно, происходит то, что вы передаете ссылку от одного ViewController к другому, не увеличивая его счет с сообщением сохранения.Это может привести к риску.

Я бы порекомендовал иметь свойство retain для ваших ViewControllers, например

@property (nonatomic, retain) NSManagedObject *yourObject;

Затем, когда вы получите свой управляемый объект, сохраните его так:

self.yourObject = ...;

... и когда вы хотите передать его другому контроллеру представления:

otherViewController.yourObject = ...;

И он позаботится о настройке удержания / разблокирования для вас.

2 голосов
/ 02 декабря 2010

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

1 голос
/ 02 декабря 2010

Просто убедитесь, что вы не сохраняете контекст NSManagedObject при передаче его новому контроллеру представления. Лучший способ справиться с этим - просто получить доступ к экземпляру AppDelegate managedObjectContext, используя

[[[UIApplication sharedApplication] delegate] managedObjectContext];

Если вы присвоите это свойству, опять же, без использования retain, вам будет хорошо с управлением памятью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...