2010-09-20 61 views
0

我在看这段代码:Objective-C的保留澄清

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 *),但是当我调用[控制器发布]不是self.viewControllers以及设置self.viewControllers =控制器会自动保留该内存?

回答

2

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

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) 
    ... 
}