Правильно ли передавать NSManagedObjects между представлениями при использовании ARC? Память предупреждение и сбой - PullRequest
3 голосов
/ 11 февраля 2012

Привет У меня неприятная проблема с управлением памятью в ARC, и я не могу понять, как ее решить. Проблема стоит так, у меня есть следующие объекты:

ObjectManager - синглтон, который выполняет fetchRequests для основных данных и выбирает один или несколько NSManagedObjects

UIViewControllerA - контроллер представления, в котором у меня есть кнопка «PassManagedObject» и свойство, объявленное как показано ниже:

@property (strong, nonatomic) ManagedObject *objectForToday;

in viewDidLoad on UIViewControllerA , я вызываю метод refreshDailyObject , который делает это:

self.objectForToday = nil;
self.objectForToday  = [[ObjectManager sharedManager] getDailyObject];

если я нажмите кнопку PassManagedObject I создать UIViewControllerB , передать objectForToday к нему и дисплей это, см. Ниже

- (IBAction)passManagedObjectTapped:(id)sender {
       UIViewControllerB *viewController = [[UIViewControllerB alloc] initWithNibName:@"UIViewControllerB"];
       viewController.object = self.objectForToday;
       [self.navigationController pushViewController:viewController animated:NO];
 }

UIViewControllerB имеет свойство, объявленное так:

@property (strong, nonatomic) ManagedObject *object;

и кнопка " Back ", которая делает это:

- (IBAction)backAction:(id)sender {
    self.object = nil;
    [self.navigationController popViewControllerAnimated:NO];
}

Теперь проблема в следующем. Если я нажимаю непрерывно passManagedObjectTapped, а затем backAction, и снова passManagedObjectTapped и снова backAction, а затем снова passManagedObjectTapped и автоматизирую это, я получаю в итоге Предупреждение о получении памяти 1 , а затем crash .

Приборы не показывают утечек, но мое распределение памяти медленно увеличивается.

Я использую ARC под iOS4.3 и iOS5. Я изо всех сил пытался выяснить, что не так в течение дня. Любая помощь будет высоко оценена.

Спасибо!

1 Ответ

5 голосов
/ 11 февраля 2012

The self.object = nil; и self.objectForToday = nil; не нужно - ARC и синтезаторы свойств уже позаботятся об этом.

Вполне вероятно, что у вас где-то есть круговая ссылка. Есть ли у вас ситуации, когда объект A имеет сильную ссылку на объект B, а объект B имеет сильную ссылку на объект A?

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

...