多个NSString声明和初始化

时间:2014-02-24 10:57:29

标签: ios objective-c nsstring

我是ios开发的新手。我正在检查NSString,我在哪里发现它是使用多种方式过度使用

1)NSString *theString = @"hello";

2)NSString *string1 = [NSString stringWithString:@"This is"];

3)NSString *string =[[NSString alloc]init]; string =@"Hello";

现在我对上面的三个感到困惑,想知道当时的差异吗?

3 个答案:

答案 0 :(得分:2)

是的,这三种方法都是创建字符串......我试着逐一解释你。

有人认为您必须记住, Objective-c 字符串由@""表示。 无论是双引号都是字符串,例如@"Hello"string@""基本上是文字的,可以创建NSString

  1. NSString *theString = @"hello";
  2. 修改

    在本声明中,我们创建了一个NSString常量。 Objective-C字符串常量在编译时创建,并在整个程序执行期间存在。

    2. NSString *string1 = [NSString stringWithString:@"This is"];
    

    在本声明中,我们正在创建一个autorelease NSString对象,但这里是幻灯片差异。比第一种情况。这里我们使用另一个NSString对象来创建autorelease的新NSString对象。因此,当我们已经拥有stringWithString对象并且我们想要另一个具有相似内容的NSString对象时,我们通常会使用NSString方法。

    3. NSString *string =[[NSString alloc]init];
                 string =@"Hello";
    

    此处,在第一个声明中,您正在创建一个您拥有的NSString对象,一旦您完成此对象,您有责任将其释放(在非ARC 代码中) 。 第二个语句类似于案例1,通过字符串文字创建字符串Object。 但是当你将这两个陈述放在一起时,它会导致你memory-leak(在非ARC 代码中),因为在陈述1中你是分配& 为新字符串对象启动内存,在第二个语句之后,您再次将新字符串对象分配给相同的字符串引用。

答案 1 :(得分:1)

1)和2)是相同的。没有区别。 [NSString stringWithString:str]什么都不做,如果str已经是不可变的,则返回str。通过this link

3)您创建空的NSString指针。为此字符串分配' ='与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 );

答案 2 :(得分:0)

好的,首先,语法@"blah"是一个用于创建NSString的Objective-C文字。基本上它是is NSString。

此外,每个声明分为两部分。声明字符串变量NSString *string和实例化string = <something>

因此...

  1. 这是你大部分时间都会这样做的。您声明变量并使用objective-c literal设置它。

  2. 这会增加一些冗余,你不会真的像这样使用它。你可以将它用于子串或来自另一个字符串的东西。因为它实际上是你在这里创建两个对象。第一个是[NSString stringWithString:<>];,第二个是@"This is"

  3. 这有点奇怪。您首先创建一个空字符串@"",然后用@"Hello"替换此字符串。不要这样做。无关紧要。您也可以只做1号,结果是相同的。

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