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
Cocoa 仪器内存泄漏_Cocoa_Cocoa Touch_Memory Leaks - Fatal编程技术网

Cocoa 仪器内存泄漏

Cocoa 仪器内存泄漏,cocoa,cocoa-touch,memory-leaks,Cocoa,Cocoa Touch,Memory Leaks,100%内存泄漏在仪器的上一行 有什么解决方案吗?您可以释放toDateTimeString,但最好像这样初始化它: NSString *toDateTimeString = [dateFormatter stringFromDate:date]; 正如文档所述,它返回一个通过复制另一个给定字符串中的字符而创建的字符串。您是否在某个时刻保留toDateTimeString?仪器会告诉您泄漏的位置,但不一定会告诉您泄漏的真正原因。从您发布的代码中可以看出,您不负责发布toDateTimeStri

100%内存
泄漏
在仪器的上一行


有什么解决方案吗?

您可以释放toDateTimeString,但最好像这样初始化它:

NSString *toDateTimeString = [dateFormatter stringFromDate:date];

正如文档所述,它返回一个通过复制另一个给定字符串中的字符而创建的字符串。

您是否在某个时刻保留
toDateTimeString
?仪器会告诉您泄漏的位置,但不一定会告诉您泄漏的真正原因。从您发布的代码中可以看出,您不负责发布
toDateTimeString
。提到但是,如果有后续行,如:

NSString *toDateTimeString = [NSString stringWithString:[dateFormatter stringFromDate:date]];

如果没有相应的版本,这将导致泄漏。如果是这种情况,那么其他两个响应是正确的,您应该在方法结束之前释放(或自动释放)
toDateTimeString
。或者,更好的做法是,只需删除保留。从-stringFromDate:返回的字符串将在方法结束时保持有效,因此无需再次保留该字符串。

还有一种可能性:所讨论的代码运行在一个环境中,它不会清除自动释放池。也许您正在一个后台线程中运行此代码,该线程在输入时没有声明自动释放池?

如果-stringFromDate:正在泄漏,复制泄漏的字符串不会解决问题。您的答案没有任何意义。你用另一个非拥有的对象替换了一个非拥有的对象,并声称它会以某种方式使内存消失。为什么这会“更好”呢?它所做的只是创建正在泄漏的字符串的冗余副本。(然后,正如BJ所说,副本将被泄露,而不是原件。但这仍然是一个漏洞。)谁说它泄露了stringFromDate???它说它在那行代码中泄漏。我的回答来自一个我认为是内存泄漏的地方。正如我所知,内存泄漏点是对象初始化的地方。在我们的例子中,initializes对象是一个NSString,因此它是一个正在泄漏的NSString,但不是stringFromDate。无论如何,如果这不是一个技术上正确的答案,您如何提高注释率。我谈到@Caleb,实际上在Objective-C对象中是内存泄漏,而不是方法。确定是否是这种情况的一种快速方法(以防您不确定是否正在使用线程;-)是在控制台中查找错误。假设在没有自动释放池的情况下,如果发送-autorelease,Cocoa将记录一个错误。很高兴知道。有时候,你的处境并不明显。例如,使用音频单元回调。Instruments确实允许您检查泄漏对象(或任何其他对象)的整个历史记录,从中您可以确定应该释放它的保留对象。
[toDateTimeString retain];