2

第一次在这里发帖。我之前正在阅读一个 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

4 回答 4

6

来自Apple 字符串编程指南

创建字符串

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

NSString *temp = @"Contrafibularity";

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

BOOL same = [@"comparison" isEqualToString:myString];
于 2013-03-31T17:44:53.437 回答
3

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

于 2013-03-31T17:41:24.043 回答
2

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

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 文字语法”。

于 2013-03-31T18:22:11.947 回答
2

只要记住这个基本的东西:-

NSString *string = ...

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

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

@"Hello"被编译器解释为常​​量字符串,编译器自己为其分配内存。

同样,声明

NSObject *myObject = somethingElse;

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

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

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

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

我希望这能回答您的问题并消除您的疑虑。:)

于 2013-03-31T18:53:45.993 回答