我整理了以下最小示例,其中 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 下泄漏?或者 ARC 是否默认将所有实例变量视为强变量,即使没有__strong
限定符或相应的(strong)
属性?