Цель-C сохранить разъяснения - PullRequest
0 голосов
/ 20 сентября 2010

Я смотрю на этот код:

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

Позже ...

- (void)dealloc {
    [viewControllers release];
    ...
}

Я вижу, что контроллеры и контроллеры self.view теперь указывают на одну и ту же выделенную память (типа NSMutableArray *), но когда я вызываю [релиз контроллеров], тоже не выпускается self.viewControllers или параметр self.viewControllers = controllers автоматически сохраняет эту память?

Ответы [ 2 ]

2 голосов
/ 20 сентября 2010

Точечная нотация (self.foo = bar;) равна вызову [self setFoo:bar];.Если объявлено, что ваше свойство сохраняет свое значение, в этом случае ваши viewcontrollers сохранят массив и освободят его, как только вы установите новое значение.

1 голос
/ 20 сентября 2010

Я предполагаю, что viewControllers - это свойство, которое сохраняет соответствующее значение.

@property (nonatomic, retain) NSArray *viewControllers;

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

// controllers -> retainCount == 0
NSMutableArray *controllers = [[NSMutableArray alloc] init]; // controllers (alloc) -> retainCount++ == +1
for (unsigned i = 0; i < kNumberOfPages; i++) {
    [controllers addObject:[NSNull null]];
}
self.viewControllers = controllers; // controllers (retained by viewControllers) -> retainCount++ == +2
[controllers release]; // controllers (released) == retainCount-- == +1

Позже ...

- (void)dealloc {
    [self.viewControllers release]; // controllers (released) -> retainCount-- == 0 (zero == no leak == no crash by over-release)
    ...
}
...