[英]Xcode static analyzer doesn't detect leak?
我把以下最小的例子放在一起,其中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的對象。
即使您多次調用該方法,靜態分析器也不僅僅足夠聰明地知道該數組指向一個保留變量。
靜態分析器只是幫助您了解何時在單個方法中泄漏對象。
但嘗試改變方法:
- (void)bar
{
// Shouldn't the static analyzer flag this as a leak?
NSArray* array2 = [[NSArray alloc] initWithObjects:@"hello", @"world", nil];
}
這將由靜態分析器檢測到。
關於ARC
使用ARC時,這段代碼沒有泄漏,因為當你說array =時,就像你:
所以如果可以,我建議轉向ARC。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.