Xcode静态分析仪没有检测到泄漏?

时间:2012-12-09 22:03:21

标签: objective-c memory-management memory-leaks automatic-ref-counting

我把以下最小的例子放在一起,其中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会泄漏NSArray个实例。 bar创建一个NSArray个实例,当其名称暗示它不会有+1保留计数。先前分配给array实例变量的实例会因为从未发布而泄露。

然而,真正令我担忧的是,我在某处读到ARC基本上使用与静态分析器相同的算法。这是否意味着此代码也会在ARC下泄漏?或者,即使没有__strong限定符或相应的(strong)属性,ARC也会将所有实例变量视为强变量?

1 个答案:

答案 0 :(得分:5)

没有弧:

它不检测泄漏,因为数组是一个实例变量。因为实例变量数组仍然可访问且有效,因此不将其视为将其分配给保留计数为1的对象的泄漏。登记/> 即使您多次调用该方法,静态分析器也不仅仅足够聪明地知道该数组指向一个保留变量 静态分析器只是帮助您了解对象何时在单一方法中泄漏 但尝试改变方法:

- (void)bar
{
    // Shouldn't the static analyzer flag this as a leak?
    NSArray* array2 = [[NSArray alloc] initWithObjects:@"hello", @"world", nil];
}

静态分析仪将检测到这一点。

关于ARC

使用ARC,这段代码没有泄漏,因为当你说array =时,就像你:

  1. 发布阵列:
  2. 保留新创建的对象;
  3. 将其分配给实例变量。
  4. 所以如果可以,我建议转向ARC。