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;) は呼び出しに相当し[self setFoo:bar];ます。プロパティがその値を保持するように宣言されている場合、この場合、viewcontrollers は配列を保持し、新しい値を設定するとそれを解放します。

于 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 に答える