为什么不分配这些NSString实例variables?
先在这里发帖。 我在前面阅读了Objective-C教程,并且看到他们已经创build了一些NSString实例variables,如下所示:
@implementation MyViewController { NSString *stringOne; NSString *stringTwo; NSString *stringThree; NSString *stringFour; NSString *stringFive; }
然后在ViewDidLoad中简单地使用它们:
- (void)viewDidLoad { [super viewDidLoad]; stringOne = @"Hello."; stringTwo = @"Goodbye."; stringThree = @"Can't think of anything else to say."; stringFour = @"Help..."; stringFive = @"Pheww, done."; }
他们如何做到这一点没有实例化string? 为什么这个工作? 当然,你必须做一些事情,如stringOne = [NSString stringFromString:@"Hello."];
正确地分配和初始化对象,然后才可以简单地执行stringOne= @"Hello.";
。
对不起,如果这是一个愚蠢的问题,但我发现这些小东西扔我。
谢谢,迈克
从Applestring编程指南 :
创buildstring
在源代码中创buildstring对象最简单的方法是使用Objective-C @“…”结构:
NSString *temp = @"Contrafibularity";
请注意,以这种方式创buildstring常量时,应该使用UTF-8字符。 这样的对象是在编译时创build的,并存在于整个程序的执行过程中。 编译器使得这些对象常量在每个模块的基础上是唯一的,而且它们永远不会被释放。 您也可以像任何其他string一样直接将消息发送到string常量:
BOOL same = [@"comparison" isEqualToString:myString];
像@"Hello"
这样的string常量已经被编译器分配和初始化了。
只要记住这个基本的东西:
NSString *string = ...
这是一个指向一个对象的指针,“不是一个对象”!
因此,声明: NSString *string = @"Hello";
将@"Hello"
对象的地址赋给指针string
。
@"Hello"
被编译器解释为一个常量string,编译器本身为它分配内存。
同样,声明
NSObject *myObject = somethingElse;
将somethingElse
的地址分配给myObject
指针,并且应该已经分配和初始化somethingElse
。
因此,声明: NSObject *myObject = [[NSObject alloc] init];
在特定的内存位置分配和初始化NSObject
对象,并将其地址分配给myObject
。
因此, myObject
包含一个对象在内存中的地址,例如:0x4324234。
只要看到我们不写"Hello"
而是@"Hello"
,这个@符号在string文字之前告诉编译器这是一个对象,它返回地址。
我希望这会回答你的问题,并清除你的疑惑。 🙂
其实这可以说是“语法糖”。 有一些其他types的NS对象,可以创build而不分配或格式化。 例如:
NSNumber *intNumber1 = @42; NSNumber *intNumber2 = [NSNumber numberWithInt:42]; NSNumber *doubleNumber1 = @3.1415926; NSNumber *doubleNumber2 = [NSNumber numberWithDouble:3.1415926]; NSNumber *charNumber1 = @'A'; NSNumber *charNumber2 = [NSNumber numberWithChar:'A']; NSNumber *boolNumber1 = @YES; NSNumber *boolNumber2 = [NSNumber numberWithBool:YES]; NSNumber *unsignedIntNumber1 = @256u; NSNumber *unsignedIntNumber2 = [NSNumber numberWithUnsignedInt:256u]; NSNumber *floatNumber1 = @2.718f; NSNumber *floatNumber2 = [NSNumber numberWithFloat:2.718f]; // an array with string and number literals NSArray *array1 = @[@"foo", @42, @"bar", @3.14]; // and the old way NSArray *array2 = [NSArray arrayWithObjects:@"foo", [NSNumber numberWithInt:42], @"bar", [NSNumber numberWithDouble:3.14], nil]; // a dictionary literal NSDictionary *dictionary1 = @{ @1: @"red", @2: @"green", @3: @"blue" }; // old style NSDictionary *dictionary2 = [NSDictionary dictionaryWithObjectsAndKeys:@"red", @1, @"green", @2, @"blue", @3, nil];
有关更多信息,请参阅“ 精彩:新的Objective-C文字语法 ”。