2013-07-22 22 views
6

我一直負責清除代碼庫中的一些Clang錯誤。我對iPhone開發和目標C非常陌生,但發現大多數問題都是微不足道的......儘管如此,當我確信它有些尷尬時,這個問題仍然困擾着我。Objective-C:'self'未設置時使用的實例變量...但它是

從ZAttributedString類:

- (id)initWithAttributedString:(ZAttributedString *)attr { 
    NSParameterAssert(attr != nil); 
    if ((self = [super init])) { 
     _buffer = [attr->_buffer mutableCopy]; 
     _attributes = [[NSMutableArray alloc] initWithArray:attr->_attributes copyItems:YES]; 
    } 
    return self; 
} 

該鐺警告是「使用實例變量而‘自我’沒有被設置爲的‘[超級或自] INIT ...]’的結果,與ATTR的_buffer屬性的非關聯被突出

如果有幫助,警告也似乎提的是,發現問題,從這個方法調用時:

- (id)copyWithZone(NSZone *)zone { 
    return [(ZAttributedString *)[ZAttributedString allocWithZone:zone] initWithAttributedString:self]; 
} 

燦任何人請向我解釋這裏的缺陷究竟是什麼?

TIA!

回答

4

不要使用->訪問實例變量,尤其是當伊娃來自其他某個對象時。

這樣做:

_buffer = [[attr string] mutableCopy]; 

同去的那個討厭的attr->_attributes。顯然,ZAttributedString exposes屬性`作爲私人頭文件中的一個屬性。


這編譯器警告似乎在非常最樂觀的,完全是誤導性的,並可能在說明相當錯誤的。提出一個錯誤來澄清這個問題會很有用。


注意@馬迪的要求,使用->直接訪問實例變量在attr字符串傳遞,因爲它的作用就像一個拷貝構造函數不正確。

傳入的attr可能是ZAttributedString實例或子類的實例,或者實際上是實現與ZAttributedString相同接口的任何類的實例。因此,你真的必須去通過訪問器,以確保你抓住了正確的狀態。

現在,作爲一個實現細節,ZAttributedString可能要求入站實例是ZAttributedString非子類的實例,但它應該使用isMemberOfClass:斷言要求(和請,不這樣做)。

直接ivar訪問有時用於從另一個對象拉狀態的唯一的地方是在copyWithZone:的實現,但是這是非常脆弱和經常導致w broken破碎的行爲。事實上,copyWithZone:(各種plist兼容的值類之外)已經充滿了脆弱性和許多許多錯誤的來源。

+3

其實,這個代碼是從'ZAttributedString'類,所以它是完全正確的使用' - 來自同一類的其他實例>'訪問的ivars。當你基本上創建一個「拷貝構造函數」時,這在這樣的代碼中是合適的。 – rmaddy

+1

即使在這種情況下,也不是很正確。 *如果*它是'-copy'方法本身,那麼*可能*(即使這在ObjC的歷史中是一個非常粗糙的邊緣 - 「NSCopyObject()」並沒有引起痛苦)。但不是在DI中。該類可能具有執行某些操作的getter的邏輯,並且入境實例可能很可能是行爲未知的子類。 – bbum

+0

@bbum:「傳入ATTR可以是ZAttributedString實例或子類的實例」'self'也可能是子類的實例,因此通過這樣的說法,你永遠無法訪問實例變量,這顯然是不正確的。 – user102008

2

看起來好像你正在看到完全相同的錯誤:"[Bug 15092] New: static analyzer false positive: reports instance variable used while 'self' is not set to the result of [(super or self)] init"。它有一個非常類似的代碼來重現錯誤。

如果運行在Xcode代碼4.6.3你可以驗證它給出了同樣的錯誤警告,你所看到的。

enter image description here

的錯誤是用comment解決:

這是固定在軀幹,或至少大部分固定的 - 還有一些邊緣 情況下,警告會火,但不是你的項目。

(戴夫,現在所有的分析儀的工程師就在蘋果公司工作,所以有沒有 真正需要的文件副本。LLVM的人誰不爲蘋果公司工作不 有機會獲得蘋果鐺,其附帶的Xcode,和此修復程序並沒有使 的Xcode 4.6,你還可以得到新的檢查從 http://clang-analyzer.llvm.org版本)

正如你所看到的錯誤是固定的,但仍然在Xcode 4.6存在。堅持下一個版本的Xcode,分析器警告應該消失。

+0

謝謝您追蹤llvm錯誤。有用! – bbum