Можно объяснить поток кода в этом примере?Утечка памяти?Куда? - PullRequest
0 голосов
/ 01 марта 2011

Обращаясь к этому примеру PageControl, кто-нибудь может объяснить поток кода? Instruments дает мне утечку, поэтому ищу помощь.

Re: этот учебник: http://www.edumobile.org/iphone/iphone-programming-tutorials/pagecontrol-example-in-iphone/

Мы инициируем массив для объектов Null в нашем методе AppDidFinishLaunching ...

NSMutableArray *controllers = [[NSMutableArray alloc] init];
for (unsigned i = 0; i < kNumberOfPages; i++) {
    [controllers addObject:[NSNull null]];
}
self.viewControllers = controllers;
[controllers release];

, а затем позвоните:

[self loadScrollViewWithPage:0];
[self loadScrollViewWithPage:1];

Вот реализация для loadScrollViewWithPage :

- (void)loadScrollViewWithPage:(int)page {
if (page < 0) return;
if (page >= kNumberOfPages) return;

PageControlExampleViewControl *controller = [viewControllers objectAtIndex:page];
if ((NSNull *)controller == [NSNull null]) {
    controller = [[PageControlExampleViewControl alloc] initWithPageNumber:page];
    [viewControllers replaceObjectAtIndex:page withObject:controller];
    [controller release];
}

if (nil == controller.view.superview) {
    CGRect frame = scrollView.frame;
    frame.origin.x = frame.size.width * page;
    frame.origin.y = 0;
    controller.view.frame = frame;
    [scrollView addSubview:controller.view];
}
}

Instruments сообщает мне об этой реализации в следующей строке:

if (nil == controller.view.superview) {

Кто-нибудь знает, почему произошла утечка в приборах? Мой код идентичен. Также после первоначального вызова [self loadScrollViewWithPage: 0]; при первом проходе и создании объекта ОБА если пункты пройдены и введены.

Как это возможно? Если мы вводим первое , если предложение , мы выделяем и создаем наш контроллер и завершаем его ** освобождением * ( [освобождение контроллера] ).

Не должна ли следующая строка ( if (nil == controller.view.superview) ) вызвать ошибку EXC_BAD_ACCESS, если мы только что выпустили controller выше?

СКРИНШОТ ИЗ ИНСТРУМЕНТОВ: Instruments screenshot

Ответы [ 3 ]

1 голос
/ 01 марта 2011

Я не знаю, почему Instruments будут сообщать об утечке в этой строке, если только он не замечает, что controller.view был выделен этой строкой (доступ к свойству представления UIViewController автоматически загружает представление при необходимости) и еще не освобожден ( которого не должно быть, пока существует scrollView, а controller.view остается его подвидом).

Правильно, что он проходит оба пункта if. Первый if проверяет, действительно ли существует контроллер представления для этого индекса страницы, и если нет, то создает его (но не не добавляет его в scrollView). Второй проверяет, было ли уже добавлено представление для контроллера представления для индекса страницы в scrollView, а если нет, то оно его добавляет.

Причина, по которой он не падает, заключается в том, что [viewControllers replaceObjectAtIndex:page withObject:controller] добавляет контроллер в NSMutableArray, который сохраняет контроллер. Это может быть немного менее запутанным, чтобы сделать это так:

if ((NSNull *)controller == [NSNull null]) {
    controller = [[[PageControlExampleViewControl alloc] initWithPageNumber:page] autorelease];
    [viewControllers replaceObjectAtIndex:page withObject:controller];
}
0 голосов
/ 01 марта 2011

Как это возможно?Если мы введем первое предложение if, мы выделим и создадим наш контроллер и закончим его * освобождением ([release controller]).

Не следует следующей строки (if (nil == controller.view.superview))) выдает ошибку EXC_BAD_ACCESS, когда мы только что выпустили контроллер RELEASED выше?

посмотрим на границу между alloc и release.

[viewControllers replaceObjectAtIndex:page withObject:controller];

массив viewControllers сохранит контроллер.

Но имхо это не хороший код.именно по той причине, которую вы указали.Не очень ясно с первого взгляда.

0 голосов
/ 01 марта 2011

Мне кажется, что вы неправильно выпускаете scrollView.

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