我对Objective-C非常陌生。我了解C和C ++,但Objective-C有相当大的学习曲线。无论如何,是否有更短的方法(可能是通过某种NSNumber字面量,如果存在这样的话)来编写以下内容:
[Tyler setArms:[[[NSNumber alloc] autorelease] initWithInt:1]];
我对Objective-C非常陌生。我了解C和C ++,但Objective-C有相当大的学习曲线。无论如何,是否有更短的方法(可能是通过某种NSNumber字面量,如果存在这样的话)来编写以下内容:
[Tyler setArms:[[[NSNumber alloc] autorelease] initWithInt:1]];
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的限制。
是的,只需要使用其中许多辅助函数之一,例如numberWithInt:
:
[Tyler setArms:[NSNumber numberWithInt:1]];
[NSNumber numberWithInt:1]
等同于[[[NSNumber alloc] initWithInt:1] autorelease]
,也等同于[[[NSNumber alloc] autorelease] initWithInt:1]
。后者表达式极为不常见。-init*
方法返回与最初分配的内容不同的东西的类(比如说,每个实例化的NSString),它将完全崩溃。 - bbum不需要分配和初始化,NSNumber
提供了一个方便的方法来完成这个操作:
[Tyler setArms:[NSNumber numberWithInt:1]];
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]
除了之前的回答外,还有两点需要注意:
首先,如果您遵循Cocoa命名规范,我们可以更容易地帮助您:变量(包括对象指针)应以小写字母开头。因此,应该使用“tyler”而不是“Tyler”。类和类型以大写字母开头。
其次,您永远不会在初始化对象之前释放它。始终先分配内存,然后进行初始化,然后执行其他操作,包括释放或自动释放。