我把以下最小的例子放在一起,其中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
实例变量的实例会因为从未发布而泄露。
__strong
限定符或相应的(strong)
属性,ARC也会将所有实例变量视为强变量?
答案 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 =时,就像你:
所以如果可以,我建议转向ARC。