Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 多个NSString声明和初始化_Ios_Objective C_Nsstring - Fatal编程技术网

Ios 多个NSString声明和初始化

Ios 多个NSString声明和初始化,ios,objective-c,nsstring,Ios,Objective C,Nsstring,我是ios开发的新手。我检查了NSString,发现它使用了多种方式,如下所示 1) NSString*theString=@“你好” 2) NSString*string1=[NSString stringWithString:@“This is”] 3) NSString*string=[[NSString alloc]init]; 字符串=@“你好” 现在我对以上三种语言感到困惑,想知道它们之间的区别吗?好的,首先,语法@“blah”是一个Objective-C文本,用于创建NSStrin

我是ios开发的新手。我检查了NSString,发现它使用了多种方式,如下所示

1)
NSString*theString=@“你好”

2)
NSString*string1=[NSString stringWithString:@“This is”]

3)
NSString*string=[[NSString alloc]init];
字符串=@“你好”


现在我对以上三种语言感到困惑,想知道它们之间的区别吗?

好的,首先,语法
@“blah”
是一个Objective-C文本,用于创建NSString。本质上,它是一个字符串

此外,每个语句有两个部分。字符串变量
NSString*string
的声明和实例化
string=

所以

  • 大多数时候你都会这样做。声明变量并使用objective-c文本进行设置

  • 这增加了一点冗余,你不会真的这样使用它。您可能会将其与子字符串或其他字符串一起使用。实际上,您在这里基本上创建了两个对象。第一个是
    [nsstringwithstring:]@“这是”

  • 这有点奇怪。您首先创建一个空字符串
    @“
    ,然后将该字符串替换为
    @“Hello”
    。不要这样做。没有意义。你也可以只做第一步,因为结果是一样的

  • 这三种方法都有效,但在这些情况下,最好使用第一种方法。

    1)和2)是一样的。没有区别。[NSString stringWithString:str]不执行任何操作,如果str已经不可变,则返回str。通过

    3) 创建空字符串指针。使用“=”分配此字符串后,与1)的方式相同,并将内存分配给NSString。您可以在3)中查看此NSString指针,您可以看到指针已更改:

    NSString *string =[[NSString alloc]init];
    printf("\n string_1-> = %p\n", string );
    string = @"Hello";
    printf("\n string_2-> = %p\n", string );
    

    是的,这三种方法都是创建字符串的方法……我试着一个接一个地解释你们

    您必须记住,在Objective-c中,字符串由
    @“
    表示。 无论什么双引号都是字符串,例如“Hello”
    string
    @“
    基本上是创建
    NSString
    的文本

  • NSString*theString=@“你好”
  • 编辑:

    在此语句中,我们创建了一个
    NSString
    常量
    Objective-C
    string常量在编译时创建,并存在于程序的整个执行过程中

    2. NSString *string1 = [NSString stringWithString:@"This is"];
    
    在这个语句中,我们再次创建了
    NSString
    autorelease
    对象,但这里的幻灯片与第一种情况不同。这里我们使用另一个
    NSString
    对象来创建
    NSString
    的新
    autorelease
    对象。因此,当我们已经有
    NSString
    对象,并且我们想要另一个具有类似内容的
    NSString
    对象时,通常使用
    stringWithString
    方法

    3. NSString *string =[[NSString alloc]init];
                 string =@"Hello";
    
    在这里,在第一条语句中,您正在创建一个您拥有的
    NSString
    对象,并且在处理完该对象后,您有责任释放它(在非ARC代码中)。 第二条语句类似于案例1,通过创建字符串对象的字符串文字。
    但当您将这两条语句放在一起时,会导致
    内存泄漏
    (在非ARC代码中),因为在语句一中,您正在为新字符串对象分配&内存,而在第二个语句之后,您又将新字符串对象分配给同一字符串引用

    @trojanfoe您能详细说明一下吗?
    字符串
    被创建(空),然后用一个常量字符串重新初始化。这是一个低效版本的1)。这是一个非常不同的解释比“是坏的”。特别是当你和一个新手谈论iOS开发的时候。我希望我已经弥补了这个不足。我不会说它完全坏了。很明显,他是有意这么说的,并问它有什么作用。我认为OP给人的印象是,这样做是可以的,但他不应该使用它。“你没有这样做。@特洛伊敌人在我的答案中添加了一位。@”“或@“字符串”什么时候开始创建自动删除的内容了?那是胡说八道@“字符串”是指向与应用程序寿命相同且永远不会释放的NSString对象的指针。@gnasher729您是对的,
    @“
    不会创建任何“自动释放”。它们被称为
    NSString
    常量,存在于整个程序中。谢谢你指出这一点,我编辑了我的答案。