gpt4 book ai didi

ios - CTLineRef 可能存在内存泄漏吗?

转载 作者:行者123 更新时间:2023-11-29 02:47:31 28 4
gpt4 key购买 nike

我的代码中存在内存泄漏,但无法解决。具体来说,我在这一行得到了 EXC_BAD_ACCESS (code=1):

CGFloat xStart = origin.x + CTLineGetOffsetForStringIndex(line, index, NULL);

在以下代码中:

- (CGRect)firstRectForNSRange:(NSRange)range;
{
NSInteger index = range.location;

NSArray *lines = (__bridge NSArray *) CTFrameGetLines(self.textFrame);
NSInteger linesCount = [lines count];
CFIndex paragraphSpacingOffset = (self.paragraphSpacing > 0) ? 1 : 0;

for (NSInteger i = 0 + paragraphSpacingOffset; i < (linesCount - paragraphSpacingOffset); i++)
{
CTLineRef line = (CTLineRef) CFBridgingRetain([lines objectAtIndex:i]);
CFRange lineRange = CTLineGetStringRange(line);
NSInteger localIndex = index - lineRange.location;

if (localIndex >= 0 && localIndex < lineRange.length)
{
NSInteger finalIndex = MIN(lineRange.location + lineRange.length, range.location + range.length);

CGPoint origin;
CTFrameGetLineOrigins(self.textFrame, CFRangeMake(i, 0), &origin);
CGFloat xStart = origin.x + CTLineGetOffsetForStringIndex(line, index, NULL);
CGFloat xEnd = origin.x + CTLineGetOffsetForStringIndex(line, finalIndex, NULL);
CGFloat ascent, descent;
CTLineGetTypographicBounds(line, &ascent, &descent, NULL);
CFRelease(line);
return CGRectMake(xStart, origin.y - descent, xEnd - xStart, ascent + descent);
}
else
{
CFRelease(line);
}
}

return CGRectNull;
}

我几乎可以肯定这是内存泄漏,因为我已经彻底检查了代码。谁能看出我对上面的 Core Foundation 对象 line 的管理不善吗?当 line 发送到 CTLineGetOffsetForStringIndex 时是否发生了某些情况,我需要再次释放它?

最佳答案

您的问题几乎肯定在这里:

CTFrameGetLineOrigins(self.textFrame, CFRangeMake(i, 0), &origin);

这表示“将从索引 i 开始到帧末尾的行写入到 origin 指向的内存中。”不幸的是,origin 仅指向一个元素,因此您将遍历堆栈的其余部分。我怀疑你的意思是 CFRangeMake(i, 1)

其他说明:

在 CFArray 和 NSArray 之间移动会造成很多复杂性。如果您只使用 CFArray,代码会简单得多:

CFArrayRef lines = CTFrameGetLines(self.textFrame);
CFIndex linesCount = CFArrayGetCount(lines);
...

CTLineRef line = (CTLineRef)CFArrayGetValueAtIndex(lines, i);

这样做,您不需要调用任何 CFRelease()。您现在调用 CFRelease 的唯一原因是因为您正在调用 CFBridgingRetain(),这使得一切变得比它需要的更复杂。有时转向 NSArray 是一件非常棒的事情,但在这种情况下却不是。

关于ios - CTLineRef 可能存在内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24917672/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com