内存泄漏sizeWithFont:constrainedToSize:lineBreakMode:

时间:2013-02-03 20:04:03

标签: ios objective-c memory-leaks instruments

在尝试创建CGSize以设置UILabel的正确高度时,我遇到了泄漏。在heightForRowAtIndexPath中设置高度时,我也会收到相同的泄漏。

这是泄漏的代码段:

CGSize size = [news.news sizeWithFont:[UIFont fontWithName:@"HelveticaNeue" size:12] constrainedToSize:CGSizeMake(230.0f, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping];

                UILabel *newsLabel = [[UILabel alloc] initWithFrame:CGRectMake(65, 50, 230, size.height)];
                newsLabel.font = [UIFont fontWithName:@"HelveticaNeue" size:12];
                newsLabel.textAlignment = NSTextAlignmentLeft;
                newsLabel.text = news.news;
                newsLabel.numberOfLines = 0;
                newsLabel.lineBreakMode = NSLineBreakByWordWrapping;
                newsLabel.textColor = COLOR_DARK_GRAY;
                newsLabel.highlightedTextColor = COLOR_WHITE;
                newsLabel.backgroundColor = COLOR_CLEAR;
                [cell.contentView addSubview:newsLabel];
                [newsLabel release];

以下是泄漏工具中列出的泄漏:

泄露的对象:icu :: UCharCharacterIterator 负责任的图书馆:WebCore 负责框架:WebCore :: LineBreakIteratorPool :: take(WTF :: AtomicString const&)

同样是指向同一行的不同泄漏:

泄露的对象:icu :: UCharCharacterIterator 负责任的图书馆:WebCore 负责框架:WebCore :: acquireLineBreakIterator(unsigned short const *,int,WTF :: AtomicString const&)

如果我能提供任何其他内容,我会很乐意这样做。我已经通过评论上面的单行(CGSize大小的创建)确认它是泄漏的线。在模拟器和设备上都会发生。

2 个答案:

答案 0 :(得分:1)

在您的语句newsLabel.font = [UIFont fontWithName:@"HelveticaNeue" size:12];中,您创建了一个要自动释放的UIFont对象。但是,如果您的代码在没有使用@autoreleasepool {}显式设置的自动释放池的线程中运行,则此对象将永远不会被释放(因为不存在自动释放池),并且会泄漏。
因此,如果您的代码确实在单独的线程中运行,请检查您是否已设置自动释放池。

答案 1 :(得分:0)

除非您有权访问WebCore代码,否则无需执行任何操作。你的代码看起来很好。 Apple的图书馆中有许多小漏洞,您有时只需要接受它们就不会消失。