【问题标题】:Mem leaks even in cases where you dont Alloc or init即使在您没有 Malloc 或 init 的情况下,内存也会泄漏
【发布时间】:2011-01-21 17:59:34
【问题描述】:

Instruments 报告我在使用 substringWithRange 的 2 行代码中出现内存泄漏。我没有在这段代码中明确使用任何分配、复制或初始化,所以我不明白为什么会发生这种情况。

只有在与这段代码相关的viewController关闭时才会出现内存泄漏。

这是有问题的代码:

NSString* path = [[NSBundle mainBundle] pathForResource:@"radio" ofType:@"txt"  
    inDirectory:@""];
NSString* data = [NSString stringWithContentsOfFile:path encoding: 
    NSUTF8StringEncoding error: NULL];      
NSString *nString;

NSString *nHolder;
NSString *iHolder;
NSMutableArray *sHolder = [[[NSMutableArray alloc] init]autorelease];

for (int i=0; i<data.length; i++) 
{
    nString = [data substringWithRange:NSMakeRange(i, 1)];
    if ([nString isEqualToString: comma])
    {
        if (commaCount == 0)
        {
                             // LEAK Reported from the below line
            nHolder = [data substringWithRange:NSMakeRange(i-rangeCount, 
                            rangeCount)];
        }
        else if (commaCount == 1)
        {
                            // LEAK Reported from the below line
            iHolder = [data substringWithRange:NSMakeRange(i-rangeCount, 
                            rangeCount)];
        }
            }
    pInfo  *myInfo = [[[pInfo alloc] init] autorelease];
myInfo = nHolder;
myInfo = iHolder;
  }

和 pInfo

@interface pInfo : NSObject 
{
NSString *name;
NSString *info;
}

@property(nonatomic, retain) NSString *name;
@property(nonatomic, retain) NSString *info;

-(id)init;
@end

在 pInfo 的 dealloc 方法中,我没有释放任何东西,因为我没有分配。

如果有人能告诉我我在这里做错了什么,我将不胜感激。

堆栈跟踪是

-[NSCFString substringWithRange:]
CFStringCreateWithSubstring
__CFStringCreateImmutableFunnel3
_CFRuntimeCreateInstance

谢谢 -代码

【问题讨论】:

  • 什么是data和nString,它们从何而来?
  • 添加了这一点。还评论了报告的泄漏的确切行

标签: iphone objective-c


【解决方案1】:

仪器告诉您泄漏分配的位置,而不是实际泄漏的位置!

您将寻找未通过发布平衡的保留。在分配工具中,您可以打开保留计数跟踪,然后查看所有保留/释放事件,看看哪些保留不平衡或不正确。

你用 nHolder 和 iHolder 做什么?

【讨论】:

  • 添加了您请求的代码。 pInfo 类中有保留。但我从来不知道当没有关联的分配时需要释放。
  • 如果你保留它,你必须释放它。由于@property 导致保留,您需要释放dealloc 中的两个ivars。请注意,由于 pInfo(顺便说一句:所有类名都应以大写字母开头)没有泄漏,因此问题在于该类中缺少发布...
  • 嗯,好的,我将在 pInfo 类的 dealloc 方法中为这些变量添加 2 个版本。或者更好的解决方案是删除保留?
【解决方案2】:

我不确定泄漏的来源(数据太少)。

您似乎正在尝试查找data 中的第一个和第二个逗号,然后取出data 的一部分。

如果是这样,只需使用类似的字符串解析/搜索 API

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html#//apple_ref/occ/instm/NSString/rangeOfString:options:range:locale:

第一个参数中的 string@"," 并且 range 是 0 以结束第一遍,第二遍 range 要搜索将是第一个逗号在末尾找到的位置.

找到您要查找的两个范围后,您可以使用substringWithRange: 获取有趣的字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    相关资源
    最近更新 更多