我应该明确释放吗?

时间:2009-01-20 01:09:25

标签: objective-c cocoa

我目前有一个字符串数组,我通过调用-componentsJoinedByString:方法从这个数组中获取一个NSString对象。例如:

NSString *someString = [[NSString alloc] initWithString: [myStrings componentsJoinedByString:@","];

由于-componentsJoinedByString:给我一个NSString,我假设它不是由我“拥有”,所以我刚刚做的应该没问题?或者我必须这样做:

NSString *toDelete = [myStrings componentsJoinedByString:@","];

NSString *someString = [[NSString alloc] initWithString:toDelete];
[toDelete release];

非常感谢帮助澄清这一点!

5 个答案:

答案 0 :(得分:4)

你写的第一个例子是正确的,虽然在实践中只写NSString *someString = [[myStrings componentsJoinedByString:@","] copy];会更清楚(请注意,这将保留,所以你必须在将来的某个时候发布它。

如果您在内存管理方面遇到问题,this page可能有所帮助。学习规则并不难,但在你做之前,你会遇到很多问题。

答案 1 :(得分:0)

如果它将在当前方法的范围之外使用,您只需要保留componentsJoinedByString:返回的字符串。

答案 2 :(得分:0)

在我打字的时候,马克回答了第一部分。

你拥有的第二套表达方式不是必需的,也是不好的做法;您正在向您不拥有的字符串release发送toDelete条消息。您正在声明指向该字符串的指针,但没有alloc指向该字符串的内存(也没有在其上调用retain),因此您不拥有{{1}的对象1}}指向。

答案 3 :(得分:0)

您是否需要在此方法之外使用此字符串?如果是这样,您可能希望将其分配给实例变量,所以这样做:

someStringIVar = [[myStrings componentsJoinedByString:@","] copy];

否则,如果仅在方法中临时使用,请执行以下操作:

NSString *someString = [myStrings componentsJoinedByString:@","];

无论哪种方式,人们似乎都非常热衷于荒谬的-initWithString:+stringWithString:电话。

答案 4 :(得分:0)

您可能不需要超过:

NSString *someString = [myStrings componentsJoinedByString:@","];

componentsJoinedByString:返回一个你不拥有的对象,但至少可以在方法的其余部分使用它,所以它对局部变量有用。

NSString *someString = [[NSString alloc] initWithString: [myStrings componentsJoinedByString:@","]];
NSString *someString = [[myStrings componentsJoinedByString:@","] copy];

这两个大致相同。你是正确的,你不需要释放componentsJoinedByString:的返回值,所以你不需要长时间保持对它的引用。你可以得到它并在同样的表达式中使用它。 Objective C的内存管理模式可以帮助您编写漂亮的代码,而不必为了内存管理而声明大量额外的局部变量并编写大量代码。

但这些都不是很有用。没有其他代码可以访问从componentsJoinedByString:返回的对象,因此没有理由制作私有副本。执行上述操作的唯一原因是,如果您想拥有该对象,在这种情况下获取所有权的更简单方法是向其发送保留消息。

NSString *someString = [[myStrings componentsJoinedByString:@","] retain];

NSString *someString = [myStrings componentsJoinedByString:@","];
[someString retain];

如果你想让对象保持更长时间,你会这样做,但通常只有在将它直接分配给实例变量时才会这样做。如果将其分配给属性,则大多数属性都被声明为retain,这意味着它们会为您执行保留。