为什么不分配这些NSString实例变量?

时间:2013-03-31 17:37:43

标签: ios objective-c

首先发布在这里。我之前正在阅读Objective-C教程,我看到他们已经制作了几个像这样的NSString实例变量:

@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.";
}

他们如何在不实例化字符串的情况下完成此操作?为什么这样做?当然,您必须执行类似stringOne = [NSString stringFromString:@"Hello."];之类的操作才能正确分配和初始化对象,然后才能完成stringOne= @"Hello.";

对不起,如果这是一个愚蠢的问题,但我发现这些小事情让我感到高兴。

谢谢, 麦克

4 个答案:

答案 0 :(得分:6)

来自Apple String Programming Guide

  

创建字符串

     

在源代码中创建字符串对象的最简单方法是使用Objective-C @“...”结构:

NSString *temp = @"Contrafibularity";
  

请注意,以这种方式创建字符串常量时,应使用UTF-8字符。这样的对象是在编译时创建的,并且在整个程序的执行过程中都存在。编译器使这些对象常量在每个模块的基础上是唯一的,并且它们永远不会被释放。您还可以像执行任何其他字符串一样将消息直接发送到字符串常量:

BOOL same = [@"comparison" isEqualToString:myString];

答案 1 :(得分:3)

编译器已为您分配并初始化了@"Hello"之类的字符串常量。

答案 2 :(得分:2)

实际上这可以说是“语法糖”。还有一些其他类型的NS对象可以在没有分配或格式化的情况下创建。 e.g:

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];

有关详细信息,请参阅“Something wonderful: new Objective-C literal syntax”。

答案 3 :(得分:2)

记住这个基本的东西: -

NSString *string = ...

这是指向对象的指针,“不是对象”!

因此,语句:NSString *string = @"Hello";@"Hello"对象的地址分配给指针string

编译器将

@"Hello"解释为常量字符串,编译器本身为其分配内存。

同样,声明

NSObject *myObject = somethingElse;

somethingElse的地址分配给指针myObject,并且somethingElse应该已经分配并初始化。

因此,语句:NSObject *myObject = [[NSObject alloc] init];在特定的内存位置分配并初始化NSObject对象,并将其地址分配给myObject

因此,myObject包含内存中对象的地址,例如:0x4324234。

只是看到我们没有编写"Hello"而是@"Hello",这个@符号在字符串文字告诉编译器这是一个对象并返回地址之前。

我希望这会回答你的问题并清除你的疑虑。 :)