2013-03-02 61 views
2

這個問題出於好奇,對於我自己的娛樂而不是它是否是個好主意,而是來自大多數C#/ JavaScript背景,不斷地看到它Objective-C的在我看來是一種醜陋:Objective-C中使用C宏alloc-init

MyClass* myObj = [[MyClass alloc] init]; 

...我很好奇,如果有可能定義一個C風格的宏這樣,這可以變成這樣:

MyClass* myObj = new MyClass; 

...或者語法上類似的東西。

有沒有人做過或看過它做過?隨意評論爲什麼這可能是一個可怕的想法(除了明顯的是非標準和陌生的),但這不會阻止我想知道它是否可以完成。如果你需要做沒有我覺得你的運氣了括號

#define new(x) [[x alloc] init] 
MyClass *myObj = new(MyClass); 

:;)

+3

你可能有興趣知道NSObject也[實現](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#// apple_ref/occ/clm/NSObject/new)'+ new',所以你可以做'MyClass * myObj = [MyClass new];'。它不像alloc/init那樣常見,但它非常有效。編輯:卡爾正在更新他的答案與這個信息,因爲我正在寫這個評論... – 2013-03-02 00:43:42

+0

這裏有一篇關於在Obj-C中使用C宏(以及這樣做的危險)的好文章:http://weblog.highorderbit .com/post/11656225202 /適當使用c-macros-for-objective-c-developers – devios1 2013-03-04 21:21:07

回答

7

你當然可以使這項工作。

NSObject提供了一個new類的方法,但。所以,你已經可以做到這一點,如果你碰巧更好喜歡它:

MyClass *myObj = [MyClass new]; 

這裏給relevant documentation的鏈接。

+0

很酷。這就是我所希望的。括號不會特別影響我。 – devios1 2013-03-02 00:42:42

+2

NO NO NO,GOD NO。這樣的代碼沒有出貨是有原因的。 – CodaFi 2013-03-02 00:56:57

+1

@CodaFi,我和你在一起。 OP說他意識到這可能是一個可怕的想法,但這並不意味着這是不可能的。 – 2013-03-02 01:01:08

1

爲什麼寫MyClass *myObj = new(MyClass);如果你可以用

#define createObject(className, objectName) className *objectName = [[className alloc] init] 

createObject(NSObject, obj); 

你的代碼肯定變得更小可讀。然後,您可以創建其他初始化程序的宏,如initWith...:

僅僅因爲可以完成某些事情,並不意味着它應該。編寫可讀代碼通常是一個好主意,而不是短代碼。

+0

我很想知道C,Objective-C(以及C++程度較低)之間的界限和限制。例如,Obj-C不支持運算符重載,所以我只是好奇它是否完全支持宏。當然,我知道大多數人會不同意我使用它們。 ;) – devios1 2013-03-02 18:56:40

+0

Objective-C是C的一個嚴格超集,因此您可以在C(包括宏)中執行的所有操作都可以在Objective-C中完成。 – Sebastian 2013-03-02 23:06:53