Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 我应该明确释放吗?_Objective C_Cocoa - Fatal编程技术网

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操作