使用Objective-C中的C宏来实现alloc-init

时间:2013-03-02 00:39:33

标签: objective-c

这个问题出于好奇,而且对于我自己的娱乐而不是它是否是一个好主意,而是来自一个主要是C#/ JavaScript的背景,不断在Objective-C中看到这个让我觉得有点难看:< / p>

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

...我很好奇是否有可能定义一个C风格的宏,以便可以将其变为:

MyClass* myObj = new MyClass;

......或者语法相似的东西。

有没有人这样做过或以前见过它?随意评论为什么它可能是一个可怕的想法(除了显而易见的,它是非标准和不熟悉的),但这不会阻止我想知道它是否可以完成。 ;)

2 个答案:

答案 0 :(得分:7)

你当然可以做到这一点:

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

如果你需要在没有括号的情况下这样做,我认为你运气不好。

NSObject提供了new类方法。所以你可以做到这一点,如果你碰巧更喜欢它:

MyClass *myObj = [MyClass new];

这是relevant documentation的链接。

答案 1 :(得分:1)

如果可以使用

,为什么要写MyClass *myObj = new(MyClass);
#define createObject(className, objectName) className *objectName = [[className alloc] init]

createObject(NSObject, obj);

您的代码肯定变得更不易读。然后,您可以为其他初始化工具创建宏,例如initWith...:

仅仅因为可以做某事,并不意味着它应该。编写可读代码通常是个好主意,而不是短代码。