为什么不分配这些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文字语法 ”。