[英]How can this Xcode Clang static analyzer warning be suppressed?
“在n行分配的對象的潛在泄漏並存儲在' 變量 '中。”
通常這是一個非常有用的分析儀警告,但是在某些情況下我會產生令人煩惱的誤報,我想抑制它以保持我的分析儀結果清潔。 在分析儀的防御中,它注意到的內存泄漏肯定是內存泄漏,而不是在另一個執行路徑中發布(它是盲目的)。
我會詳細說明我的情況。 它有各種風格,但一般模式如下:
這根本不是一種深奧的設計模式,所以我希望抑制是可能的。 我知道可以通過將違規物品存放在稍后釋放的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給出了以下場景:
如果您只想將已分配對象的生命周期延長到分配/刪除對象的生命周期,而不是顯式版本,則可以:
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.