Могу ли я сохранить View при выпуске его ViewController? - PullRequest
1 голос
/ 10 июля 2009

Я пытаюсь загрузить новое представление в существующий контроллер представления, но я хочу загрузить это представление из файла XIB. Мой план состоял в том, чтобы создать второй viewController (viewController1 в приведенном ниже коде), затем сохранить его представление и выпустить тот viewController, который я только что создал. Я надеялся, что viewController будет выпущен, а представление останется, но этого, похоже, не происходит.

Вопрос 1: Если контроллеры представлений освобождаются, освобождается ли ассоциированное с ними представление независимо от того, каков счетчик сохранения представления? В моем примере кода ниже вы можете видеть, что представление имеет счетное число 13, прежде чем оно внезапно просто исчезнет.

Вопрос 2. Почему сохранение представления увеличивает его retainCount на 3?

PageViewController *viewController1 = [[PageViewController alloc] initWithNibName:@"Page1" bundle:nil];
[viewController1.view setUserInteractionEnabled:YES];

NSLog (@"vc retain count: %d", [viewController1 retainCount]); //count=1
NSLog (@"vc view retain count: %d", [viewController1.view retainCount]); //count=4

self.currentPageView=viewController1.view;

NSLog (@"vc retain count: %d", [viewController1 retainCount]); //count=1
NSLog (@"vc view retain count: %d", [viewController1.view retainCount]); //count=7


[viewController1.view retain];

NSLog (@"vc retain count: %d", [viewController1 retainCount]); //count=1
NSLog (@"vc view retain count: %d", [viewController1.view retainCount]); //count=10

[self.view addSubview:viewController1.view];

NSLog (@"vc retain count: %d", [viewController1 retainCount]); //count=1
NSLog (@"vc view retain count: %d", [viewController1.view retainCount]); //count=13

[viewController1 release];

NSLog (@"vc view retain count: %d", [viewController1.view retainCount]); 
//objc[3237]: FREED(id): message view sent to freed object=0x538ce0

Ответы [ 3 ]

1 голос
/ 10 июля 2009

Это может помочь:

[[NSBundle mainBundle] loadNibNamed:@"Page1" owner:self options:nil];

где self - это существующий viewController.

1 голос
/ 10 июля 2009

эта строка бессмысленна

self.currentPageView=viewController1.view;

Представление в viewController1 еще не построено, потому что метод loadView в этом контроллере не вызывается

хотя вы можете добавить новое подпредставление в viewController.view из-за «магии», позволяющей вам добавить объект в представление, которое еще не построено.

Это не меняет факта - viewController.view в это время не существует.

примечание: весь controller.view встроен в метод viewDidLoad / loadView, и viewDidLoad / loadView не будет вызывать до тех пор, пока не будет отображено (например, pushController)

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

1 голос
/ 10 июля 2009

Ошибка, которую вы получаете по поводу «сообщения, отправленного освобожденному объекту», не говорит о том, что представление было освобождено, это то, что viewController1 было освобождено, и, таким образом, вы получая ошибку при отправке сообщения «просмотр». (помните, что в Objective C каждый доступ к свойству действительно отправляет сообщение ...)

Я не уверен, почему количество сохраняемых изображений увеличивается на 3 каждый раз.

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