Некоторое понимание управления памятью - PullRequest
1 голос
/ 28 декабря 2011

Я создал свойство viewController и сохранил его из ClassB viewController (Class A).

так что в основном у меня есть @property (nonatomic, retain) ClassAViewControllerVC, и он синтезирован в основном файле.

У меня есть IBAction, в котором я размещаю ClassAViewController и помещаю его в стек навигации, но я пытаюсь проанализировать, где я должен выпустить этот viewController?контроллер представления после того, как я укладываю его на навигационный контроллер, как описано выше?

Кроме того, это хорошая идея, чтобы установить свойство для такого viewController в первую очередь?Я начал замечать, что мои приложения начали падать, если не использовали @property retain way.Любые мысли или проблемы будут оценены.

Спасибо

Ответы [ 3 ]

3 голосов
/ 28 декабря 2011

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

В этом примере вы создаете ClassAViewController с alloc, что означает, что вызывающая сторона (этот метод) несет ответственность за ее освобождение после завершения работы сit.

Когда вы добавляете его в стек контроллера навигации, контроллер навигации сохраняет его, потому что сохраняет ссылку на него.

Итак, в конце этого метода вы должны освободитьэто, но он был сохранен контроллером навигации, поэтому он не удаляется.

Код должен выглядеть следующим образом:

- (IBAction) response {
    ClassAViewController *viewController = [ClassAViewController alloc] initWithNib:@"ClassAViewController" 
                                                                             bundle:[NSBundle mainBundle]];

    [self.navigationController pushViewController:viewController animated:YES]

    [viewController release];
}

PS В target-C принято записывать имена переменных, начиная сс строчной буквы.Прописные начальные буквы используются для имен классов, и это сбивает с толку чудовище из меня!;)

0 голосов
/ 28 декабря 2011

Лучший способ решить эту проблему - перетащить пустой UIViewController в ваш файл ClassB.xib. Создайте @property (nonatomic, retain) ClassAViewControllerVC, установите соединение с пустым UIViewController, просто перетащите его в файл classB.xib, а также измените имя NIB на имя файла класса A nib. Это решит все проблемы сбоев, потому что вы не выделяете и не освобождаете память.

0 голосов
/ 28 декабря 2011

если ClassAViewControllerVC является полем ClassB, вы должны освободить его в методе dealloc.

Но вам, вероятно, следует создать ClassAViewControllerVC в init или, что еще лучше, в методе viewDidLoad (примечание: если вы создаете что-то в viewDidLoad, вам также необходимо освободить это представление viewDidUnload, а не только в dealloc)

Потому что теперь каждый раз, когда вызывается метод «Class», ClassAViewControllerVC будет создаваться заново. (и нет особого смысла хранить его в собственности). Если это то, что вам нужно, вы, вероятно, не должны делать ClassAViewControllerVC полем вашего ClassB, а просто иметь его в качестве локальной переменной s в методе ответа, подобном следующему:

- (IBAction) response {
    ClassAViewController *classAViewController = [ClassAViewController alloc] initWithNib:@"ClassAViewController" bundle:[NSBundle mainBundle]];

    [self.navigationController pushViewController:classAViewController animated:YES];
    [classAViewController release];

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