【问题标题】:NSNumber LiteralsNSNumber 字面量
【发布时间】:2011-07-19 10:15:12
【问题描述】:

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

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

【问题讨论】:

  • 对于那些想知道的人,Tyler 是我创建的 Human 类的一个实例。

标签: objective-c literals nsnumber foundation


【解决方案1】:

从 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 约束。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我不知道是在告诉它自动释放之前还是之后初始化对象。谢谢。 :)
    • 后一种表达方式不仅不常见,而且完全不正确!对于那些 -init* 方法返回的东西不是最初分配的东西的类(比如,每个实例化的 NSString),它将完全中断。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      在 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 page。

      【讨论】:

      • 我已经看过手册页,现在在我的项目中使用 Xcode 4.4,但 IDE 抱怨 @YES 不好 - 我检查了 标头,它仍然说#define YES (BOOL)1,而不是__objc_yes。有什么想法可能是更新出了什么问题?
      • 你是如何使用它的?您的项目是针对哪个版本的 SDK 构建的?
      • 基础 SDK iOS 5.1,Xcode 4.4 (4F250),部署目标 iOS 5.0。会不会是iOS?
      【解决方案5】:

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

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

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

      【讨论】:

      • 啊,我什至没有意识到我使用了大写T。我从来没有想过。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 2011-02-18
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      相关资源
      最近更新 更多