1

在一种频繁跟踪换行符的方法中,对于NSTextView visibleRect,我正在为NSGlyph分配内存以使用NSLayoutManager getGlyphs:range:

我应该/我能找出这应该是多少内存,因为我有一个范围的参考(不影响布局),而且,应该进行什么样的清理——使用ARC运行?

代码(在主队列上运行):

    NSLayoutManager *lm = [self.textView layoutManager];
    NSTextContainer *tc = [self.textView textContainer];
    NSRect vRect = [self.textView visibleRect];
    NSRange visibleRange = [lm glyphRangeForBoundingRectWithoutAdditionalLayout:vRect inTextContainer:tc];
    NSUInteger vRangeLoc = visibleRange.location;
    NSUInteger numberOfLines;
    NSUInteger index;
    NSGlyph glyphArray[5000]; // <--- memory assigned here
    NSUInteger numberOfGlyphs = [lm getGlyphs:glyphArray range:visibleRange];
    NSRange lineRange;
    NSMutableIndexSet *idxset = [NSMutableIndexSet indexSet];
    for (numberOfLines = 0, index = 0; index < numberOfGlyphs; numberOfLines++) {
        (void)[lm lineFragmentRectForGlyphAtIndex:index effectiveRange:&lineRange withoutAdditionalLayout:YES];
        [idxset addIndex:lineRange.location + vRangeLoc];
        index = NSMaxRange(lineRange);
    }
    self.currentLinesIndexSet = idxset;
4

1 回答 1

1

使用该NSGlyph glyphs[5000]符号,您可以在堆栈上分配内存。但它只需要保存字形,而不是 5000 个visibleRange.length + 1字形:

字形数组

在输出时,来自glyphRange的可显示字形以空值结尾。结果中不包括任何NSNullGlyph或其他未显示的字形。传入的内存应该足够大,至少可以容纳glyphRange.length+1元素。

而且因为它在堆栈上,所以你不必担心释放内存——因为永远不会分配内存;离开函数时它会自动释放——即使没有ARC

所以它应该可以工作,如果你这样写:

NSLayoutManager *lm = ...
NSRange glyphRange = ...
NSGlyph glyphArray[glyphRange.length + 1];
NSUInteger numberOfGlyphs = [lm getGlyphs:glyphArray range:glyphRange];
// do something with your glyphs
于 2013-05-28T20:05:17.520 回答