分配时是否必须使用initWithString?

时间:2011-07-27 10:23:18

标签: objective-c ios nsstring

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

此代码崩溃。如果我使用如下,那就没关系。

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

分配后我不能使用initWithString吗?

4 个答案:

答案 0 :(得分:6)

重新初始化内存已经通过在第一行调用-init进行了初始化。

NSString个对象是 immutable ,这意味着无法以任何方式修改其内部字符缓冲区。如果您需要此功能,请使用NSMutableString

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

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

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

然后,您可以使用各种方法(-setString:replaceCharactersInRange:withString:等)来处理字符串。

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

答案 1 :(得分:4)

您的问题表明您不希望在同一行代码上分配和初始化对象。当你有某种逻辑用不同的字符串初始化它并且你想把这个逻辑放在分配和初始化之间时就是这种情况。

+ alloc方法是分配对象的方法,-init初始化它。虽然这是一个共同的惯例,但并不要求将这些方法一起调用。因此,以下代码有效,并允许您在分配和初始化之间放置代码:

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

更常见的另一种解决方案是在分配之前放置指针的声明,因此以下内容也是有效的。

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

从技术上讲,这仍然会一起分配和初始化对象,如果由于某种原因实际上需要在两个单独的行上分配和初始化对象,我建议我的第一个例子。

答案 2 :(得分:1)

这是正确的:

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

您不应该在对象上调用两次init方法,就像您在代码中所做的那样。所以,你只需在分配时初始化。

答案 3 :(得分:0)

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

是对的。另请注意,无论何时使用alloccopynew,您都拥有该对象,并且必须在某个时间点将其释放

[str release];