2011-02-12 94 views
7

Objective-C中有類似的指令:是否可以在Objective-C中創建自定義指令?

  • @interface
  • @implementation
  • @end
  • @protocol
  • @property
  • @synthesize

我想這些東西像複雜的馬可或代碼生成器。是否可以爲代碼生成目的創建自定義指令?一種可能的用途是爲CoreData生成方法。

我在想沒有,因爲我從來沒有見過它,但我的世界不是這個世界。


的後續問題:

喬納森下文提到的,這是可以編寫自己的預處理器,這回避了如何的問題。目前,#define SYMBOLIC_CONSTANT 102將在文件移動到編譯器之前,用文件中的字符102替換字符SYMBOLIC_CONSTANT的所有實例。

我知道它XCode,你可以添加一個「運行腳本階段」到目標構建過程。所以我可以編寫一個腳本來查找像'$ coredata'這樣的自定義預處理指令,然後讓該腳本生成一個新文件,其中字符$ coredata替換爲一些代碼字符。但是從我所瞭解的XCode構建過程中,您無法將更改後的文件提供到編譯器源代碼階段。這些文件由IDE指定並鎖定。

有沒有人做過類似的事情?我知道使用外部構建系統是可能的,但說實話我並不是那麼瞭解。我不知道Build和Run按鈕的功能。

在此期間,我開始閱讀蘋果的Xcode文檔...

感謝您的答覆!

+0

我沒有說這會很容易。然而,像`$ coredata`這樣的東西是一個有效的C預處理器標記(`$`可以在符號/宏名稱中使用),所以它可以在#define語句中使用。不過,如果你告訴我們你的目標,我們可能會提出一個更容易或更好的解決問題的方法。 – 2011-02-12 19:27:50

回答

3

你的想法是正確的:在你的代碼中這是不可能的。增加更多@ -directives的唯一方法是通過編譯器本身。即使你遇到了這些麻煩,我幾乎可以保證突出顯示對它們的支持的語法被硬編碼到某處的Xcode配置文件中。

哦,如果您正在考慮使用預處理器宏,我的理解是@字符在預處理器宏中是非法的。

編輯:我跑了一個測試,我是正確的。在C預處理器宏中使用@字符是非法的。他們遵循與變量名稱相同的規則。

3

你的意思是在Objective-C的範圍內嗎?不,因爲它無法識別您的新關鍵字。您可以編寫一個預處理程序來檢測@whatever並將其轉換爲代碼,但是如果您告訴我們具體要做什麼,我們可能會提出更有效或最佳的方法。

+1

@字符在C預處理器宏中是非法的。 – 2011-02-12 00:44:34

+0

感謝您的迴應。你給了我如何做到這一點的想法。忘了你不需要語言鉤子來生成代碼。 – Tobias 2011-02-12 01:38:31

+2

@Carter:我說*寫一個預處理程序*而不是*使用內置的*。不是我想要使用需要自己的自定義預處理器的代碼。 (哦,等等,我每天都用Objective-C ......) – 2011-02-12 12:59:20

0

這是不可能的。這些是構建在Objective-C語言中的關鍵字。僅僅因爲在他們面前有一個@並不會使它們與其他關鍵字不同。

5

雖然接受的答案是正確的,但是對於這種問題有一個部分的解決方法,其中libextobjc庫採用。考慮this code,你會發現像下面有定義:

#define weakify(...) \ 
    try {} @finally {} \ 
    metamacro_foreach_cxt(ext_weakify_,, __weak, __VA_ARGS__) 

這樣的定義允許使用以下格式weakify關鍵字:

id foo = [[NSObject alloc] init]; 
id bar = [[NSObject alloc] init]; 

@weakify(foo, bar); 

庫的作者解釋它here

由於這些宏旨在與@pre給它們排序 (就像@strongify(self);),try {}吸收符號,所以它不會造成語法錯誤。


更新後

From now on libextobjc使用@autoreleasepool爲 「沉浸在符號」。

相關問題