Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.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
Iphone 如何交换两个NSString变量(在非垃圾收集环境中)?_Iphone_Objective C_Ios4 - Fatal编程技术网

Iphone 如何交换两个NSString变量(在非垃圾收集环境中)?

Iphone 如何交换两个NSString变量(在非垃圾收集环境中)?,iphone,objective-c,ios4,Iphone,Objective C,Ios4,我试图交换两个字符串,但我不确定我所做的是否合法(来自java,我对整个保留计数内存管理是新手) 这是我的密码: NSString *temp = [[NSString alloc] init]; temp = originalLanguageCode; originalLanguageCode = translatedLanguageCode; translatedLanguageCode = temp; [temp release]; 允许这样做吗?我发现了一些奇怪的虫子,我不确定是什么导

我试图交换两个字符串,但我不确定我所做的是否合法(来自java,我对整个保留计数内存管理是新手)

这是我的密码:

NSString *temp = [[NSString alloc] init];
temp = originalLanguageCode;
originalLanguageCode = translatedLanguageCode;
translatedLanguageCode = temp;
[temp release];

允许这样做吗?我发现了一些奇怪的虫子,我不确定是什么导致了它们,希望这就是它。非常感谢您的帮助,谢谢

除了第一行创建的字符串在第二行中立即泄漏外,所有内容看起来都很好。你可以说:

NSString *temp = originalLanguageCode;
...
。。。并且去掉[temp release],因为您没有创建(也没有拥有)分配给“temp”的对象


现在您没有说originalLanguageCode和translatedLanguageCode是否是实例变量。如果是这样,请使用它们的访问器(它们本身应该在内存管理方面做正确的事情)。

除了第一行中创建的字符串在第二行中立即泄漏外,其他一切看起来都很好。你可以说:

NSString *temp = originalLanguageCode;
...
。。。并且去掉[temp release],因为您没有创建(也没有拥有)分配给“temp”的对象


现在您没有说originalLanguageCode和translatedLanguageCode是否是实例变量。如果是这样,请使用它们的访问器(它们本身应该在内存管理方面做正确的事情)。

将新分配的字符串分配给
temp
后,您立即将
originalLanguageCode
分配给它,因此分配的字符串将完全丢失。这是内存泄漏。然后,您将释放原来是原始语言代码的
temp
。这是一个过度释放

请尝试以下方法:

NSString *temp = originalLanguageCode;
originalLanguageCode = translatedLanguageCode;
translatedLanguageCode = temp;

将新分配的字符串分配给
temp
后,您立即将
originalLanguageCode
分配给它,因此分配的字符串将完全丢失。这是内存泄漏。然后,您将释放原来是原始语言代码的
temp
。这是一个过度释放

请尝试以下方法:

NSString *temp = originalLanguageCode;
originalLanguageCode = translatedLanguageCode;
translatedLanguageCode = temp;

谢谢你的回复!我想我可能做了些可疑的事。那我怎么处理临时工呢?这不是一个新创建的变量吗?(我认为哪一个是64位UINT?还是32位取决于体系结构?)我认为在temp上调用release是正确的,例如[temp release];影响temp指向的实际字符串对象,而不是temp本身(本身是UINT)?如果是这样的话,那么如果我作为迭代算法的一部分在一个长循环中这样做,会不会有很多未使用的指针变量?有什么地方可以让我了解更多信息吗?@codenoob:
temp
是指向NSString的指针-您在代码中声明了它(
NSString*temp
)。它可能与64位整数大小相同,但这取决于硬件。变量以某种方式堆积在一个循环中的想法根本不是它的工作原理。我建议阅读任何C语言书籍或教程来解释基本类型是如何工作的。谢谢你的回复!我想我可能做了些可疑的事。那我怎么处理临时工呢?这不是一个新创建的变量吗?(我认为哪一个是64位UINT?还是32位取决于体系结构?)我认为在temp上调用release是正确的,例如[temp release];影响temp指向的实际字符串对象,而不是temp本身(本身是UINT)?如果是这样的话,那么如果我作为迭代算法的一部分在一个长循环中这样做,会不会有很多未使用的指针变量?有什么地方可以让我了解更多信息吗?@codenoob:
temp
是指向NSString的指针-您在代码中声明了它(
NSString*temp
)。它可能与64位整数大小相同,但这取决于硬件。变量以某种方式堆积在一个循环中的想法根本不是它的工作原理。我建议阅读任何C语言书籍或教程来解释基本类型是如何工作的。