【问题标题】:Using C macros in Objective-C to alloc-init在 Objective-C 中使用 C 宏来分配初始化
【发布时间】:2013-03-02 00:39:33
【问题描述】:

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

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

...我很好奇是否可以定义一个 C 风格的宏,这样它就可以变成这样:

MyClass* myObj = new MyClass;

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

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

【问题讨论】:

  • 你可能有兴趣知道 NSObject 也是 implements +new 所以你可以做 MyClass *myObj = [MyClass new];。它不像 alloc/init 那样常见,但它完全有效。编辑:而且,当我写这篇评论时,卡尔正在用这个信息更新他的答案......
  • 这是一篇关于在 Obj-C 中使用 C 宏(以及这样做的危险)的好文章:weblog.highorderbit.com/post/11656225202/…

标签: objective-c


【解决方案1】:

你当然可以做到这一点:

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

如果您需要在没有括号的情况下执行此操作,我认为您不走运。

NSObject 提供了一个 new 类方法。因此,如果您碰巧更喜欢它,您已经可以这样做了:

MyClass *myObj = [MyClass new];

这是relevant documentation的链接。

【讨论】:

  • 酷。这正是我所希望的。括号并没有特别困扰我。
  • 不不不,上帝不。这样的代码没有发布是有原因的。
  • @CodaFi,我和你在一起。 OP 说他知道这可能是一个可怕的想法,但这当然并不意味着这是不可能的。
【解决方案2】:

如果可以使用,为什么要写MyClass *myObj = new(MyClass);

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

createObject(NSObject, obj);

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

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

【讨论】:

  • 我很想知道 C、Objective-C(以及较小程度上的 C++)之间的界限和限制在哪里。例如,Obj-C 不支持运算符重载,所以我只是好奇它是否完全支持宏。当然,我知道大多数人会不同意我对它们的使用。 ;)
  • Objective-C 是 C 的严格超集,因此您可以在 C 中执行的所有操作(包括宏)都可以在 Objective-C 中完成。
猜你喜欢
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多