我已經把下面的小例子,其中的Xcode(4.5.2)靜態分析顯然沒有檢測到泄漏,爲了覈實一些意見我已經就這個靜態分析:Xcode靜態分析器不檢測泄漏?
#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是否默認將所有實例變量視爲強壯?
是的,在ARC下,所有實例變量(和範圍內的局部變量)都被視爲強變量。 – Mario