0

我正在尝试查找我的一个 iOS 程序中的内存泄漏。我想我已经把它钉在了与这些类似的几行上:

NSString *s1Upper = [s1 uppercaseString];
s1Upper = [s1Upper stringByTrimmingCharactersInSet: 
    [NSCharacterSet whitespaceCharacterSet]]; 

(我知道从逻辑的角度来看这两行没有意义,只是说明了我的记忆问题。)

假设 s1 是 @"abc "(以空格结尾)。我理解 NSStrings 的方式,s1Upper 在第一行代码之后指向一个 NSString(@"ABC" 以空格结尾)。在第二行之后,它指向不同的 NSString(@"ABC" 没有空格)。

我的问题:第一个 NSString 什么时候发布?

我的猜测是当当前的 NSAutoreleasePool 耗尽时它会被释放。在这种情况下,我有一个后续问题:我如何影响这一点并控制排水?

4

1 回答 1

2

它是自动释放的,即在自动释放池耗尽时释放。通常在当前运行循环结束时。

在这种情况下,您无法真正更改它。你能做的就是retain它,然后release当你知道它是安全的时候。这将防止它被自动释放池排水管释放。

您无法阻止这些对象自动进入自动释放池,因为该方法的内部实现会这样做。您只能通过保留对象来确保自动释放不会将保留计数降至零。

于 2012-04-17T22:15:02.517 回答