【问题标题】:iphone/ipad memory leak from NSString assigned to itself分配给自身的 NSString 的 iphone/ipad 内存泄漏
【发布时间】:2010-09-17 10:04:27
【问题描述】:

仪器工具显示我有两个泄漏。我在谷歌上环顾四周,但我还没有看到我的问题。

问题 #1:

self.wallText = [[text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];

我已经尝试了上述线路的各种配置,但都泄漏了。我需要做这两个修剪操作。 'text' 用 @"" 或 stringWithFormat 声明。

我的另一个问题是以下行:

    NSString * value = [elements objectAtIndex:i+1];
if ([value length] >= 2 && [[value substringToIndex:2] isEqualToString:@"S_"]){
   value = [value substringFromIndex:2]; // LEAK HERE
    }

我需要获取除前 2 个字符之外的所有字符串,所以我不知道如何先释放它或其他什么...如果这确实是我应该做的。

以前的项目我可以避免泄漏,但这个非常占用内存,我需要我能得到的所有内存!

任何指针将不胜感激

【问题讨论】:

  • 为了让人们有效地回答,您需要添加更多信息:(a) 值是如何声明和初始化的。 (b) 如何为walltext 定义@property。
  • 是的墙帖是用保留定义的。那么这是否意味着“文本”不会泄露?
  • 不要将retainNSString 属性一起使用。使用copy

标签: iphone ipad memory-leaks


【解决方案1】:

你是否为wallText声明@property (retain),你是否在dealloc方法中声明[wallText release]

仔细检查以上内容,您将不再有泄漏

更新部分:

那里有内存泄漏真的很奇怪。因为起初,您的 value 指向一个 autoreleased 对象,然后它指向另一个 autoreleased 对象,我认为这很好。

【讨论】:

  • +1 提供一些细节:这是因为@synthesize'd 具有“保留”语义的setter 方法在设置和保留新值之前释放当前值。所以直接“覆盖”这些属性是内存安全的。
  • 不,我没有在 dealloc 方法中使用 release。情况总是如此...每当我在@property 声明中保留一个属性时,我必须在dealloc 中释放它?即使是 IBoutlet 属性也是如此吗?
  • 是的,如果你声明一个@property(retain) 你必须在dealloc中释放,即使是IBOutlet。它不仅仅是@property(retain),而且如果你拥有一些实例变量(alloc, retain and copy),你必须在dealloc中释放。还要确保你没有过度释放它(始终使用 self.variable 作为属性)
  • 好的,很高兴知道谢谢。我的问题 #2 仍然存在泄漏。我已经更新了代码示例。
  • 您应该创建另一个可以吸引更多答案的问题:)。人们通常不会看旧的、更新的问题
【解决方案2】:

让你使用 alloc 来获取价值。 value = [value substringFromIndex:2]; .here 现在值引用新的自动释放字符串。所以你不能释放以前的对象。

【讨论】:

  • 我从不使用 alloc 创建新字符串。它总是使用文字,从另一个变量分配,或者使用字符串实用方法之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
  • 2011-03-20
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多