2013-03-02 43 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