簡體   English   中英

Xcode靜態分析儀沒有檢測到泄漏?

[英]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 =時,就像你:

  1. 發布數組:
  2. 保留新創建的對象;
  3. 將其分配給實例變量。

所以如果可以,我建議轉向ARC。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM