簡體   English   中英

如何抑制Xcode Clang靜態分析儀警告?

[英]How can this Xcode Clang static analyzer warning be suppressed?

“在n行分配的對象的潛在泄漏並存儲在' 變量 '中。”

通常這是一個非常有用的分析儀警告,但是在某些情況下我會產生令人煩惱的誤報,我想抑制它以保持我的分析儀結果清潔。 在分析儀的防御中,它注意到的內存泄漏肯定是內存泄漏,而不是在另一個執行路徑中發布(它是盲目的)。

我會詳細說明我的情況。 它有各種風格,但一般模式如下:

  1. 分配對象並設置其委托。
  2. 對象完成了一些事情。 (任務開始,顯示視圖等)。
  3. 當前方法的執行結束。 (輸入Clang警告)。
  4. 對象決定其任務完成,向委托發送消息。
  5. 委托發布對象。

這根本不是一種深奧的設計模式,所以我希望抑制是可能的。 我知道可以通過將違規物品存放在稍后釋放的ivar中來避免,但我非常希望不添加ivar污染。

Clang有一些新的Source Annotations 具體而言,您可能對ns_consumed屬性感興趣。

我認為在這種情況下你應該注意靜態分析器消息。 您的模式存在潛在問題。

具體來說,當您從調用的方法返回到執行步驟5時,您處於可能已經被釋放的對象的方法中。 我解釋你的模式是這樣的:

// steps 1, 2, 3
-(void) methodThatCreatesObject
{
    id theObj = [[TheObj alloc] init];
    [theObj setDelegate: delegateObj];
    // other stuff
}

請注意,上述內容違反了內存管理規則

// step 4 - a method of theObj
-(void) someMethod
{
    [delegate notifyTaskCompleteFromObj: self];
    // self points to an invalid object here.  Doing anything with self results in EXC_BAD_ACCESS
}

以上內容違反了內存管理規則中的規定:

收到的對象通常保證在收到的方法中保持有效

如果我們說self是一個接收對象,從技術上來說,因為它作為參數傳遞給堆棧。

// step 5 the delegate method defined in the delegate object

-(void) notifyTaskCompleteFromObj: (TheObj*) anObj
{
    // do stuff
    [anObj release];
}

以上也違反了內存管理規則。

正常模式是擁有一個控制器,該控制器擁有委托和具有委托的對象(通常控制器本身就是委托)。 我認為你應該采用這種模式。

這里有另一個有趣的選擇。 OP給出了以下場景:

  1. 分配對象並設置其委托。
  2. 對象完成了一些事情。 (任務開始,顯示視圖等)。
  3. 當前方法的執行結束。 (輸入Clang警告)。
  4. 對象決定其任務完成,向委托發送消息。
  5. 委托發布對象。

如果您只想將已分配對象的生命周期延長到分配/刪除對象的生命周期,而不是顯式版本,則可以:

TheObject* foo = [[TheObject alloc] init] autorelease];
foo.delegate = self;
[foo doSomething];
objc_setAssociatedObject(self, foo, foo, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
return;

通過將foo設置為具有保留策略的關聯對象,委托(self)將有效地保留對象,該對象隨后在釋放委托(self)時被釋放(稍后)。

OP並不完全是OP所要求的,但它仍然是一種有用的模式,並且感覺它可能足以滿足OP所呈現的情況。

暫無
暫無

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

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