我目前有一个字符串数组,我通过调用-componentsJoinedByString:
方法从这个数组中获取一个NSString对象。例如:
NSString *someString = [[NSString alloc] initWithString: [myStrings componentsJoinedByString:@","];
由于-componentsJoinedByString:
给我一个NSString,我假设它不是由我“拥有”,所以我刚刚做的应该没问题?或者我必须这样做:
NSString *toDelete = [myStrings componentsJoinedByString:@","];
NSString *someString = [[NSString alloc] initWithString:toDelete];
[toDelete release];
非常感谢帮助澄清这一点!
答案 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,这意味着它们会为您执行保留。