4

我对 Objective-C 很陌生。我知道 C 和 C++,但 Objective-C 有相当的学习曲线。无论如何,是否有一种更短的方法(如果存在,可能是某种 NSNumber 文字)来编写以下内容:

[Tyler setArms:[[[NSNumber alloc] autorelease] initWithInt:1]];
4

5 回答 5

17

Clang v3.1开始,您现在可以使用 Objective-C 文字。

NSNumber *fortyTwo = @42;             // equivalent to [NSNumber numberWithInt:42]
NSNumber *fortyTwoUnsigned = @42U;    // equivalent to [NSNumber numberWithUnsignedInt:42U]
NSNumber *fortyTwoLong = @42L;        // equivalent to [NSNumber numberWithLong:42L]
NSNumber *fortyTwoLongLong = @42LL;   // equivalent to [NSNumber numberWithLongLong:42LL]

所以,回答你的具体问题:

[Tyler setArms:[[[NSNumber alloc] autorelease] initWithInt:1]];

现在可以写成:

[Tyler setArms:@1];

数组和字典也有文字,但它们超出了这个问题的范围。

要利用 Xcode 中的文字,您至少需要 4.4 版(在撰写本文时,这只是一个预览版)。

注意:LLVM 是一个开源项目,因此这些都不受 Apple 的 NDA 约束。

于 2012-06-20T13:12:17.357 回答
6

是的,只需使用许多辅助函数之一,例如numberWithInt:

[Tyler setArms:[NSNumber numberWithInt:1]];

表达式[NSNumber numberWithInt:1]等价于[[[NSNumber alloc] initWithInt:1] autorelease],即等价于[[[NSNumber alloc] autorelease] initWithInt:1]。后一种表达方式极为少见。

于 2011-03-21T04:22:09.693 回答
3

您不必分配和初始化,NSNumber提供了一种方便的方法来做到这一点:

[Tyler setArms:[NSNumber numberWithInt:1]];
于 2011-03-21T04:23:22.087 回答
3

在 Xcode 4.4 中,现在有 NSNumber 字面量:

  // integral literals.
  NSNumber *fortyTwo = @42;             // equivalent to [NSNumber numberWithInt:42]
  NSNumber *fortyTwoUnsigned = @42U;    // equivalent to [NSNumber numberWithUnsignedInt:42U]
  NSNumber *fortyTwoLong = @42L;        // equivalent to [NSNumber numberWithLong:42L]
  NSNumber *fortyTwoLongLong = @42LL;   // equivalent to [NSNumber numberWithLongLong:42LL]

  // floating point literals.
  NSNumber *piFloat = @3.141592654F;    // equivalent to [NSNumber numberWithFloat:3.141592654F]
  NSNumber *piDouble = @3.1415926535;   // equivalent to [NSNumber numberWithDouble:3.1415926535]

  // BOOL literals.
  NSNumber *yesNumber = @YES;           // equivalent to [NSNumber numberWithBool:YES]
  NSNumber *noNumber = @NO;             // equivalent to [NSNumber numberWithBool:NO]

到目前为止,我看到的最好的文档在llvm 手册页中。

于 2012-07-27T17:04:26.317 回答
2

除了前面的回答外,还有两件事都是正确的:

首先,如果您遵循 Cocoa 命名约定,我们会更容易提供帮助:变量,包括对象指针,应该以小写字母开头。所以,“泰勒”而不是“泰勒”。类和类型以大写字母开头。

其次,您永远不会在初始化对象之前自动释放它。总是先分配,然后初始化,然后做任何你需要做的事情,包括释放或自动释放。

于 2011-03-21T04:25:12.243 回答