Xcode (4.5.2) 静的アナライザーが明らかにリークを検出しない次の最小限の例をまとめました。これは、静的アナライザーについて行ったいくつかの観察を検証するためです。
#import <Foundation/Foundation.h>
@interface Foo : NSObject {
NSArray *array;
}
@property (nonatomic, retain) NSArray *array;
- (void)bar;
@end
@implementation Foo
@synthesize array;
- (void)bar
{
// Shouldn't the static analyzer flag this as a leak?
array = [[NSArray alloc] initWithObjects:@"hello", @"world", nil];
}
@end
int main(int argc, const char *argv[])
{
@autoreleasepool {
Foo *foo = [[Foo alloc] init];
[foo bar];
[foo bar];
[foo bar];
[foo release];
}
return 0;
}
私が間違っていなければ、繰り返し呼び出すとインスタンスbar
がリークします。その名前がそうしないことを意味する場合、+1 保持カウントでインスタンスを作成します。以前にインスタンス変数に割り当てられたインスタンスは解放されないため、リークされます。NSArray
bar
NSArray
array
しかし、本当に気になるのは、ARC が基本的に静的アナライザーと同じアルゴリズムを使用していることをどこかで読んだことです。これは、このコードが ARC でもリークするということですか? __strong
それとも、修飾子や対応する(strong)
プロパティがなくても、ARC はすべてのインスタンス変数をデフォルトで強力なものとして扱いますか?