2011-07-27 103 views
0
NSString *str = [[NSString alloc]init]; 
str = [str initWithString:@""]; 

此代码崩溃。如果我像下面一样使用,那就OK。分配时是否必须使用initWithString?

NSString *str = [[NSString alloc]initWithString:@""]; 

分配后我不能使用initWithString吗?

回答

4

你的问题建议你不想来分配和初始化在同一行的对象的代码。如果你有某种逻辑会用不同的字符串初始化它,并且你想把逻辑放在分配和初始化之间,那就是这种情况。

+ alloc方法是分配对象的方法,-init初始化它。没有要求这些方法一起调用,虽然这是一个常见的惯例。因此,下面的代码是有效的,并允许你把代码分配和初始化之间:

NSString *str = [NSString alloc]; 
str = [str initWithString:@""]; 

不同的解决方案,还算比较常见的是将指针的声明中的分配之前,因此以下也是有效的。

NSString *str = nil; 
str = [[NSString alloc] initWithString:@""]; 

从技术上讲这仍然会分配和共同初始化对象,如果你因为某些原因需要实际分配和初始化两个单独的行我会建议我的第一个例子中的对象。

1

这是正确的:

NSString *str = [[NSString alloc] initWithString:@""]; 

你不应该调用一个对象上的init方法两次,就像你在你的代码做的事情。所以,你只是在初始化时分配。

+0

我知道它的工作原理。分配后我需要initWithString。我怎么做? – user698200

+0

你能解释一下你正在尝试做什么吗? – sergio

6

你是重新初始化已经通过第一行调用-init初始化的内存。

NSString对象是不可变,这意味着它们的内部字符缓冲区不能以任何方式修改。如果您需要此功能,请使用NSMutableString

因此,你的代码对我来说没有意义,因为没有办法修改字符串,为什么用空字符串来创建它?

我建议创建一个NSMutableString对象,像这样:

NSMutableString *str = [[NSMutableString alloc] init]; 

然后,您可以淤泥与周围的字符串以各种方法(-setString:replaceCharactersInRange:withString:等)

我没有看到为什么你会创建一个字符串(即你自己不会少于)的任何其他原因,这是用一个空的缓冲区初始化的。

0
NSString *str = [[NSString alloc] initWithString:@""]; 

是正确的。还记得,每当你使用alloccopynew你自己的对象,并有在某点来释放它

[str release]; 
相关问题