Неправильный код в образце кода Apple? - PullRequest
5 голосов
/ 19 марта 2011

Я посмотрел пример проекта Apple «PageControl» ( См. Здесь ) и вижу эту функцию в коде:

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

    // replace the placeholder if necessary
    MyViewController *controller = [viewControllers objectAtIndex:page];
    if ((NSNull *)controller == [NSNull null])
    {
        controller = [[MyViewController alloc] initWithPageNumber:page];
        [viewControllers replaceObjectAtIndex:page withObject:controller];
        [controller release];
    }

    // add the controller's view to the scroll view
    if (controller.view.superview == nil)
    {
        CGRect frame = scrollView.frame;
        frame.origin.x = frame.size.width * page;
        frame.origin.y = 0;
        controller.view.frame = frame;
        [scrollView addSubview:controller.view];

        NSDictionary *numberItem = [self.contentList objectAtIndex:page];
        controller.numberImage.image = [UIImage imageNamed:[numberItem valueForKey:ImageKey]];
        controller.numberTitle.text = [numberItem valueForKey:NameKey];
    }
}

Есть кое-что, чего я не понимаю.
Если тестовая часть if ((NSNull *)controller == [NSNull null]) верна, то имеем

controller = [[MyViewController alloc] initWithPageNumber:page];
[viewControllers replaceObjectAtIndex:page withObject:controller];
[controller release];

Затем сразу после:

if (controller.view.superview == nil)

Но контроллер только что освобожден. Я думаю, что это может работать, потому что контроллер все еще находится в памяти, но не является ли это неправильным способом кодирования вещей?

Ответы [ 2 ]

3 голосов
/ 19 марта 2011

Я думаю, ты прав.Если бы я кодировал это, я бы добавил:

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

Чтобы получить ссылку после выпуска.

Или я полагаю, что другим способом было бы использовать авто-релиз вместо выпуска.

2 голосов
/ 19 марта 2011

При добавлении объекта controller в viewControllers, который сохранил объект. Следовательно, он все еще является живым объектом после того, как его выпустят.

Это неправильно? Возможно, это требует знания того, что делает NSArray, но это довольно часто.

Я бы сделал это так:

if ((NSNull *)controller == [NSNull null])
{
    controller = [[[MyViewController alloc] initWithPageNumber:page] autorelease];
    [viewControllers replaceObjectAtIndex:page withObject:controller];
    controller = [viewControllers objectAtIndex:page];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...