2012-03-03 39 views
7

帶類別的約定是在擴展Apple類時包含前綴。例如:用魔術詞爲類別添加前綴的約定是什麼?

[string XXDataUsingUTF8]; 

(是的,這是一個愚蠢的例子只是去用它。)

什麼我就不太清楚的是慣例是什麼時,該標識符與copy開始,setinitnew

例如:

[request setHTTPBodyWithKeyValues: keyValues]; 

如果添加我的前綴,這不再遵循「制定者開始設置」約定。

[request XXSetHTTPBodyWithKeyValues: keyValues]; 

在另一方面,如果我的設置後添加前綴,它不再是一個真正的前綴:

[request setXXHTTPBodyWithKeyValues: keyValues]; 

這不是非常有set進口,但我覺得它變得更重要的有init,copy

蘋果有沒有在任何地方記錄這個?什麼是常用的?

+2

我從來沒見過這個任何官方指引,但在不混淆ARC或LLVM靜態分析儀,或任何其他的利益工具或人類閱讀你的代碼,我會選擇保持傳統的前綴在選擇器的開始。就個人而言,我在類別擴展方法名稱中使用下劃線,因爲「​​真實」方法永遠不會包含一個,因此保留了「前綴」的唯一性。在你的例子中,將會是'setXX_HTTPBodyWithKeyValues:'。在非基於約定的擴展方法中,它只是成爲'XX_myMethodName'。 – pmdj 2012-03-03 17:55:41

+0

我想這真的是唯一的*實用*答案,不是嗎?感謝您指出明顯。 :) – 2012-03-03 18:40:28

+1

非常有趣的一點!有些人喜歡後綴他們的「名字空間」字符串:'setHTTPBodyWithKeyValues_XX:'這不是更漂亮。 – 2012-03-03 18:52:37

回答

11

你可以在接口聲明中明確設置的方法家族:

@interface NSObject (StevenFisherCategory) 

- (NSData *)XXCopyDataUsingUTF8 __attribute__((objc_method_family(copy))); 

@end 
+0

這是一個很好的觀點。這絕對是繼續使用Xcode 4.3以及後來使用LLVM的方法,特別是在ARC中。 – 2012-03-03 21:35:58

+1

很棒的回答。試圖找出如何讓我的前綴init方法工作。 '__attribute __((objc_method_family(init)))'''做了訣竅 – edelaney05 2013-04-04 21:30:51

相關問題