我是ios开发的新手。我正在检查NSString,我在哪里发现它是使用多种方式过度使用
1)NSString *theString = @"hello";
2)NSString *string1 = [NSString stringWithString:@"This is"];
3)NSString *string =[[NSString alloc]init];
string =@"Hello";
现在我对上面的三个感到困惑,想知道当时的差异吗?
答案 0 :(得分:2)
是的,这三种方法都是创建字符串......我试着逐一解释你。
有人认为您必须记住, Objective-c 字符串由@""
表示。
无论是双引号都是字符串,例如@"Hello"
是string
。 @""
基本上是文字的,可以创建NSString
。
NSString *theString = @"hello";
修改强>
在本声明中,我们创建了一个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>
。
因此...
这是你大部分时间都会这样做的。您声明变量并使用objective-c literal设置它。
这会增加一些冗余,你不会真的像这样使用它。你可以将它用于子串或来自另一个字符串的东西。因为它实际上是你在这里创建两个对象。第一个是[NSString stringWithString:<>];
,第二个是@"This is"
。
这有点奇怪。您首先创建一个空字符串@""
,然后用@"Hello"
替换此字符串。不要这样做。无关紧要。您也可以只做1号,结果是相同的。
这三种方法都有效,但在这些情况下你最好使用第一种方式。