1

有谁知道为什么会发生这种情况?

在此处输入图像描述

该错误清楚地表明它正在尝试访问已被释放的字典的 objectForKey。但是在堆栈跟踪中我没有看到任何字典。这怎么可能?

所以这里是代码:

-(CGSize)sizeConstrainedToSize:(CGSize)maxSize fitRange:(NSRange*)fitRange {
    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)self);
    CFRange fitCFRange = CFRangeMake(0,0);
    CGSize sz = CTFramesetterSuggestFrameSizeWithConstraints(framesetter,CFRangeMake(0,0),NULL,maxSize,&fitCFRange);
    if (framesetter) CFRelease(framesetter);
    if (fitRange) *fitRange = NSMakeRange(fitCFRange.location, fitCFRange.length);
    return CGSizeMake( floorf(sz.width+1) , floorf(sz.height+1) ); // take 1pt of margin for security
}

更新:

原来这是 NSCache 上的一个问题:

@implementation NSCache (SharedCache)
+(NSCache*)sharedCache;
{
    static NSCache* sharedCache = nil;
    if (sharedCache == nil) {
        sharedCache = [[[self alloc] init] retain];
        [sharedCache setCountLimit:0];
    }
    return sharedCache;
}

如果我删除了保留它会崩溃..

它基本上在这里崩溃:

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)self);

除了那个例外。

4

1 回答 1

1

属性或成员变量之一是或包含已被释放的字典。您可能有代码在过度释放的属性字符串上设置属性字典。

最终,您突出显示的代码是识别过度释放的对象,而不是崩溃代码。您需要找到对象被过度释放的位置。我建议使用 Xcode 性能工具,特别是 Zombies 工具来识别此崩溃。它只是模拟器,所以这需要在模拟器中重现才能使用僵尸工具。

于 2012-05-20T23:41:35.723 回答