【问题标题】:Why aren't these NSString instance variables allocated?为什么不分配这些 NSString 实例变量?
【发布时间】:2013-03-21 21:00:43
【问题描述】:

第一篇文章在这里。我之前正在阅读一个 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.";

对不起,如果这是一个愚蠢的问题,但我发现这些小东西把我扔了。

谢谢, 迈克

【问题讨论】:

  • 他们通过对字符串文字的赋值来实例化它们。
  • 切勿使用stringWithFormat,除非您确实有需要格式化的字符串。
  • 我花了很长时间才获得移动设备上的支持链接来编辑最后一条评论。编译器实际分配这些字符串见stackoverflow.com/questions/8032375/…
  • 另外,像NSObject *object = [[NSObject alloc] init]; object = somethingElse; 这样的人做错了,所以不要效仿他们:)
  • 谢谢卡尔。因此,它应该是 NSObject *object = somethingElse,而不是 somethingElse,因为 somethingElse 已经实例化,object 不需要,对吧?

标签: ios objective-c


【解决方案1】:

来自Apple String Programming Guide

创建字符串

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

NSString *temp = @"Contrafibularity";

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

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

【讨论】:

  • 感谢您的回答,简洁明了。底部的那一点非常有用;将@"..." 视为可以接收消息的东西会很奇怪。
  • objective-c中的@是一个对象操作符,所有以它开头的都是一个对象,例如@11是一个NSNumber,它存储值11,不是int。另一方面,如果您认为这是您问题的正确答案,请接受它
【解决方案2】:

@"Hello" 这样的字符串常量已经被编译器分配和初始化了。

【讨论】:

  • 感谢您的回答。因此,如果@"..." 被分配并初始化,我就不必实例化 NSString,对吗?
  • 对,它是一个预分配的NSString* 对象(技术上是const NSString* const)。您可以在任何接受NSString* 对象的地方使用字符串文字(例如@"...:")。 (当然除了它是一个常量,不能修改)
  • 完美,非常感谢 :) 一切都清楚。我在我的代码中经常不必要地实例化 NSString ......似乎需要进行大规模清理。
【解决方案3】:

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

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",这个@符号在字符串字面量之前告诉编译器这是一个对象,它返回地址。

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

【讨论】:

    【解决方案4】:

    其实这可以说是“语法糖”。还有一些其他类型的 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];
    

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

    【讨论】:

    • 这个答案在哪里解决了关于NSString的问题?
    • 你先生,让我大吃一惊。我已将此添加到我的小语法书中,因为它很全面,可以帮助我了解何时分配/初始化以及何时不分配。谢谢。顺便说一句,很抱歉我不能 +1,因为我显然没有足够的代表。
    • @rmaddy 我解释说这只是一个语法问题,并给出了其他示例。你看我的回答了吗?
    • @rmaddy 我认为他意识到我已经理解了 NSString 问题,并提供了更多示例来帮助我理解这个概念。
    • 我明白了。我只是指出这个答案并没有回答这个问题。它只提供无关但有用的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多