Objective c 我应该明确释放吗?
我目前有一个字符串数组,我通过调用Objective c 我应该明确释放吗?,objective-c,cocoa,Objective C,Cocoa,我目前有一个字符串数组,我通过调用-componentsJoinedByString:方法从这个数组中获取一个NSString对象。例如: NSString *someString = [[NSString alloc] initWithString: [myStrings componentsJoinedByString:@","]; 由于-componentsJoinedByString:返回一个NSString,我假设它不是我“拥有的”,因此我刚才所做的应该可以吗?或者我必须这样做: N
-componentsJoinedByString:
方法从这个数组中获取一个NSString对象。例如:
NSString *someString = [[NSString alloc] initWithString: [myStrings componentsJoinedByString:@","];
由于-componentsJoinedByString:
返回一个NSString,我假设它不是我“拥有的”,因此我刚才所做的应该可以吗?或者我必须这样做:
NSString *toDelete = [myStrings componentsJoinedByString:@","];
NSString *someString = [[NSString alloc] initWithString:toDelete];
[toDelete release];
someStringIVar = [[myStrings componentsJoinedByString:@","] copy];
非常感谢帮助澄清这一点 如果将在当前方法的作用域之外使用,则只需保留由
组件joinedbystring:
返回的字符串。如果将在当前方法的作用域之外使用,则只需保留由组件joinedbystring:
返回的字符串。您编写的第一个示例是正确的,尽管在实践中,只编写NSString*someString=[[myStrings componentsJoinedByString:@“,“]copy]更为清晰代码>(请注意,这将被保留,因此您必须在将来的某个时候发布它
如果您在内存管理方面遇到问题,可能会有所帮助。学习规则并不难,但在学习之前,您会遇到很多问题。您编写的第一个示例是正确的,但实际上编写NSString*someString=[[myStrings componentsjoinedbytring:@],“]copy]会更清楚一些
(请注意,这将被保留,因此您必须在将来的某个时候发布它
如果您在内存管理方面遇到问题,可能会有所帮助。学习规则并不难,但在学习之前您会遇到很多问题。我打字时,马克回答了第一部分
您拥有的第二组表达式不是必需的,这是不好的做法;您正在向您不拥有的字符串toDelete
发送release
消息。您正在声明一个指向该字符串的指针,但没有alloc
指向该字符串的内存(也没有在其上调用retain
)所以你不拥有toDelete所指向的对象。Marc在我打字时回答了第一部分
您拥有的第二组表达式不是必需的,这是不好的做法;您正在向您不拥有的字符串toDelete
发送release
消息。您正在声明一个指向该字符串的指针,但没有alloc
指向该字符串的内存(也没有在其上调用retain
)因此,您不拥有toDelete
指向的对象。以后是否需要在此方法之外使用此字符串?如果需要,您可能希望将其分配给实例变量,请执行以下操作:
NSString *toDelete = [myStrings componentsJoinedByString:@","];
NSString *someString = [[NSString alloc] initWithString:toDelete];
[toDelete release];
someStringIVar = [[myStrings componentsJoinedByString:@","] copy];
否则,如果仅在方法中临时使用,请执行以下操作:
NSString *someString = [myStrings componentsJoinedByString:@","];
无论哪种方式,人们似乎太热衷于调用荒谬的-initWithString:
和+stringWithString:
调用都是绝对没有必要的。以后是否需要在该方法之外使用该字符串?如果需要,您可能希望将其分配给实例变量,请执行以下操作:
NSString *toDelete = [myStrings componentsJoinedByString:@","];
NSString *someString = [[NSString alloc] initWithString:toDelete];
[toDelete release];
someStringIVar = [[myStrings componentsJoinedByString:@","] copy];
否则,如果仅在方法中临时使用,请执行以下操作:
NSString *someString = [myStrings componentsJoinedByString:@","];
无论哪种方式,人们似乎太热衷于使用荒谬的-initWithString:
和+stringWithString:
调用都是完全没有必要的。您可能只需要:
NSString *someString = [myStrings componentsJoinedByString:@","];
componentsJoinedByString:返回一个您不拥有的对象,但您至少可以在方法的其余部分使用它,因此它适合于局部变量
NSString *someString = [[NSString alloc] initWithString: [myStrings componentsJoinedByString:@","]];
NSString *someString = [[myStrings componentsJoinedByString:@","] copy];
这两者大致相当。您不需要释放componentsJoinedByString:的返回值,因此您不需要将引用保持足够长的时间来执行此操作。您可以获得它并在相同的表达式中使用它。Objective C的内存管理模式帮助您编写类似这样的漂亮代码,而不是hav仅仅为了内存管理,我们需要声明大量额外的局部变量并编写大量代码
但这两个都不是很有用。没有其他代码可以访问从ComponentJoinedByString:返回的对象,因此没有理由创建私有副本。执行上述操作的唯一原因是如果您想拥有该对象,在这种情况下,获得该对象所有权的更简单方法是向其发送一条retain消息
NSString *someString = [[myStrings componentsJoinedByString:@","] retain];
或
如果您想让对象保留更长的时间,您可以这样做,但通常只有在将其直接分配给实例变量时才这样做。如果将其分配给属性,则大多数属性都声明为retain,这意味着它们为您执行retain操作。您可能只需要:
NSString *someString = [myStrings componentsJoinedByString:@","];
componentsJoinedByString:返回一个您不拥有的对象,但您至少可以在方法的其余部分使用它,因此它适合于局部变量
NSString *someString = [[NSString alloc] initWithString: [myStrings componentsJoinedByString:@","]];
NSString *someString = [[myStrings componentsJoinedByString:@","] copy];
这两者大致相当。您不需要释放componentsJoinedByString:的返回值,因此您不需要将引用保持足够长的时间来执行此操作。您可以获得它并在相同的表达式中使用它。Objective C的内存管理模式帮助您编写类似这样的漂亮代码,而不是hav仅仅为了内存管理,我们需要声明大量额外的局部变量并编写大量代码
但这两个都不是很有用。没有其他代码可以访问从ComponentJoinedByString:返回的对象,因此没有理由创建私有副本。执行上述操作的唯一原因是如果您想拥有该对象,在这种情况下,获得该对象所有权的更简单方法是向其发送一条retain消息
NSString *someString = [[myStrings componentsJoinedByString:@","] retain];
或
如果您想让对象保留更长时间,您可以这样做,但通常只有在将其直接分配给实例变量时才这样做。如果将其分配给属性,大多数属性都声明为retain,这意味着它们为您执行retain操作