0

我正在看这段代码:

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.viewControllers 和控制器现在指向相同的分配内存(类型为 NSMutableArray *),但是当我调用 [controllers release] 时 self.viewControllers 也没有释放,或者设置 self.viewControllers = controllers 自动保留那个记忆?

4

2 回答 2

2

点符号 ( self.foo = bar;) 等于 call [self setFoo:bar];。如果您的属性被声明为保留其值,那么您的视图控制器将在这种情况下保留该数组,并在您设置新值后释放它。

于 2010-09-20T15:02:32.697 回答
1

我将假设这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)
    ...
}
于 2010-09-20T15:13:26.180 回答