![](/img/trans.png)
[英]if (self = [super init]) vs. if ((self = [super init]))
[英]if(self = [super init]) - LLVM warning! How are you dealing with it?
在使用LLVM的Xcode 4之前,這沒有引起注意。 條件中的賦值是完全有意的,也是一個Cocoa成語。
選擇了LLVM編譯器的Xcode 4永遠不會抱怨,而不僅僅是在編譯時,只要你輸入它就會出現黃色警告圖標。 將警告視為錯誤而忽略警告似乎不是一個好主意。 將分配移出括號會浪費空間。 必須為每個新項目用pragma關閉此警告將變得乏味。
你是怎么處理它的? 新的成語是什么?
這實際上是一個非常古老的警告,它默認關閉GCC和Clang 1.6。 Xcode實際上應該給你一個如何解決它的建議 - 即括號加倍。
if ((self = [super init])) { ... }
額外的一對parens告訴編譯器你確實打算在條件中進行賦值。
如果您從較新的Xcode文本宏創建一個init方法,您會注意到執行init的新祝福方式是:
- (id)init {
self = [super init];
if (self) {
<#initializations#>
}
return self;
}
這避免了警告。 雖然我個人在我自己的代碼中,如果我遇到這個,我只是應用凱文顯示的方法。
不錯的東西!
只需使用兩對括號就可以清楚地告訴編譯器您是故意分配的:
if ((self = [super init]))
打開項目導航器並選擇您的項目。 在出現的主窗口中,選擇“全部”。 在“LLVM編譯器2.0 - 警告”部分下,選擇“其他警告標志”。 為“Debug”和“Release”添加標記“Wno-idiomatic-parentheses”。 現在清理並重新編譯。
正如其他一些人建議你應該添加一組額外的括號。
我遠離正規表達大師,所以請隨意清理它,但是在Xcode中查找並替換了大約95%的實例:
Replace: if\s*\({1}\s*self\s*={1}(.*)\){1}
With: if ((self =\1))
要小心,因為這也會找到if(self == ...),所以使用預覽並取消選中那些或修復我的正則表達式:)
並開始使用self = ...; 如果(自我),它更清潔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.