2010-07-08 40 views
0

Xcode的「構建和分析」有多可靠?XCode的構建和分析 - 錯誤或正確發現潛在的泄漏?

我一直在尋找它發現的「潛在的泄漏」 - 但不明白它。

下面的代碼:

-(void)viewDidLoad{ 

    self.navigationItem.leftBarButtonItem = self.editButtonItem; 

    UIBarButtonItem *aBI = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd 
                     target:self action:@selector(add:)]; 

    self.navigationItem.rightBarButtonItem = aBI; 
    aBI.release; 

    UIBarButtonItem *eB = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemOrganize 
                     target:self action:@selector(EinstellungenTapped:)]; 
    UIBarButtonItem * space = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 


    UIBarButtonItem *emailB = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCompose 
                     target:self action:@selector(emailTapped:)]; 


    NSArray* toolbarItems = [NSArray arrayWithObjects: eB,space,emailB, 
          nil]; 

    [self setToolbarItems: toolbarItems]; 

    eB.release;  // <------- Potential leak ?????? 
    emailB.release; // <------- Potential leak ?????? 
    space.release; // <------- Potential leak ?????? 
    } 

爲什麼要這三個是潛在的泄漏?

即使沒有assignemt到NSArray的它告訴我泄漏。

這裏有什麼問題?

許多感謝....

+0

爲了使它「更糟糕」...這是一種解決方法,以便警告不再出現 - 但是 - 我認爲它仍然泄漏: 只需添加賦值:self.navigationItem.rightBarButtonItem = eB; =>沒有警告了。 – user387184 2010-07-09 13:19:38

回答

2

我想這個問題是因爲你是可怕的錯誤使用點語法和混亂的靜態分析。你永遠不應該不斷anObject.release,因爲具有完全錯誤的意思。點語法設計用於訪問屬性,並具有特定的語義含義,例如,訪問一個屬性。任何修改對象本身的東西都應該是一種方法,而不是一種屬性,應該這樣調用。

換句話說,改變那些

[eB release]; 
[emailB release]; 
[space release]; 

,事情應該很好地工作。現在靜態分析儀應該認識到你確實正在釋放物體。

作爲一個最後要注意的,但事實上,eB.release技術上作品都可以被認爲是編譯器是如何工作的神器。儘管我不相信這樣會永遠破碎,但我也不知道它是否保證不會,而且依賴的方式非常糟糕。

+0

是的,我無法相信 - 我完全忽略了這些 - 當然,你是完全正確的。 非常感謝額外的一雙眼睛! – user387184 2010-07-13 09:25:27