首先发布在这里。我之前正在阅读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.";
。
对不起,如果这是一个愚蠢的问题,但我发现这些小事情让我感到高兴。
谢谢, 麦克
答案 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"
,这个@符号在字符串文字告诉编译器这是一个对象并返回地址之前。
我希望这会回答你的问题并清除你的疑虑。 :)