NSNumber字面量

4

我对Objective-C非常陌生。我了解C和C ++,但Objective-C有相当大的学习曲线。无论如何,是否有更短的方法(可能是通过某种NSNumber字面量,如果存在这样的话)来编写以下内容:

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

对于那些好奇的人,Tyler是我创建的Human类的一个实例。 - Tyler Crompton
5个回答

18
截至 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版本(在撰写本文时仅为预览版)。

NB:LLVM是一个开源项目,因此没有受到苹果NDA的限制。


6

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

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

表达式[NSNumber numberWithInt:1]等同于[[[NSNumber alloc] initWithInt:1] autorelease],也等同于[[[NSNumber alloc] autorelease] initWithInt:1]。后者表达式极为不常见。

我不知道是在告诉对象自动释放之前还是之后初始化它。谢谢 :) - Tyler Crompton
1
后面的表达不仅不常见,而且完全错误!对于那些-init*方法返回与最初分配的内容不同的东西的类(比如说,每个实例化的NSString),它将完全崩溃。 - bbum

3

不需要分配和初始化,NSNumber 提供了一个方便的方法来完成这个操作:

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

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手册 中。

我看过了man页面,现在正在使用Xcode 4.4进行我的项目,但IDE抱怨@YES不好用 - 我检查了<objc/objc.h>头文件,它仍然说#define YES (BOOL)1,而不是__objc_yes。有任何想法更新出了什么问题吗? - themarketka
你是如何使用它的?你的项目构建在哪个版本的SDK上? - drewish
基础 SDK iOS 5.1,Xcode 4.4(4F250),部署目标 iOS 5.0。这可能是iOS的问题吗? - themarketka

2

除了之前的回答外,还有两点需要注意:

首先,如果您遵循Cocoa命名规范,我们可以更容易地帮助您:变量(包括对象指针)应以小写字母开头。因此,应该使用“tyler”而不是“Tyler”。类和类型以大写字母开头。

其次,您永远不会在初始化对象之前释放它。始终先分配内存,然后进行初始化,然后执行其他操作,包括释放或自动释放。


啊,我甚至没有意识到我用了大写的T。这从未发生在我脑海中。谢谢。 - Tyler Crompton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接