2013-10-04 77 views
13

nonnull適用於C函數,但不適用於obj-c方法。需要明確的是,我建議這個爲什麼沒有clang的'nonnil'屬性?

- (void)doSomethingWithRequiredString:(NSString * __attribute((nonnil)))requiredString 
            bar:(NSString *)optionalString); 

或(更喜歡非空)

- (void)doSomethingWithRequiredString:(NSString *)requiredString 
            bar:(NSString *)optionalString) 
__attribute((nonnil(0))); 

我也困惑過是否有良好的技術理由。我明白,clang只能真正使用該屬性進行編譯時檢查或靜態分析,但似乎是正交的。 不是有這個嗎?

+0

我懷疑:'clang'是一個龐大的系統工程。它的開發人員有更好的事情要做。 – 2013-10-04 16:05:48

回答

26

你完全可以。你做錯了的唯一的事情是認爲方法參數0指數的,而事實上,他們是1索引(哦,這是nonnull,不nonnil):

- (void)doSomethingWithRequiredString:(NSString *)requiredString 
            bar:(NSString *)optionalString 
     __attribute((nonnull(1))); 

現在,當您嘗試使用:

id thing = ...; 
[thing doSomethingWithRequiredString:nil bar:@"42"]; 

的Xcode會說向您發出一個「空傳遞給需要非空參數被叫」。此外,如果您省略__attribute的「(1)」部分,則假定非零要求適用於全部參數。

鏘承認海合會屬性,以及海合會的nonnull屬性的定義是在這裏:http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Function-Attributes.html#index-g_t_0040code_007bnonnull_007d-function-attribute-1733


更新:由於Xcode 6.3一個更清晰的語法支持。

在屬性和方法中,關鍵字是nullable,nonnullnull_unspecified

所以,你的方法簽名將成爲這樣的:

- (void)doSomethingWithRequiredString:(nonnull NSString *)requiredString 
            bar:(nullable NSString *)optionalString; 
+0

非常感謝。這是索引,讓我。那是意想不到的。 – griotspeak

+0

@griotspeak是的,這也給我一個循環。 –

+0

@DaveDeLong是否有一個更簡單的每個參數版本的這個屬性,類似於'__unused'? – danyowdee

相關問題