NSMutableArrayやNSArrayをautorelease以外でメモリ確保した場合、配列を解放しても要素の解放処理が呼び出されるわけではありません。
ar1 = [[NSMutableArray alloc] initWithObjects:@"TEST1", @"TEST2", @"TEST3", nil];
ar2 = [[NSMutableArray alloc] initWithObjects:[SomeClass alloc]
, [SomeClass alloc]
, [SomeClass alloc], nil];
arrays = [[NSArray alloc] initWithObjects:ar1, ar2, nil];
・
・
・
[arrays release]; // ar1 / ar2 とSomeClassがメモリリーク
上記例では、「arrays」の解放しか行っていないので、「ar1」「ar2」「SomeClass」が全てメモリリークとなります。
「TEST1」「TEST2」「TEST3」の文字列はautoreleaseされるので解放の必要はありません。
要素を全て解放すればメモリリークしなくなります。
[ar1 release]; // ar1を解放
// ar2の要素を解放
for (int i = 0; i < ar2.count; i++) {
SomeClass* tmp = [ar2 objectAtIndex:i];
[tmp release];
}
[ar2 release]; // ar2を解放 [arrays release]; // arraysを解放
0 件のコメント:
コメントを投稿