有谁知道为什么会发生这种情况?
错误清楚地表明它正在尝试访问已解除分配的字典的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);
有例外。
答案 0 :(得分:1)
其中一个属性或成员变量是或包含已解除分配的字典。您可能有代码在属于过度释放的属性字符串上设置属性字典。
最终,您突出显示的代码是识别过度释放的对象,但不是崩溃的代码。您需要找到对象过度释放的位置。我建议使用Xcode性能工具,特别是Zombies工具来识别此崩溃。它只是模拟器,因此需要在模拟器中重现才能使用僵尸工具。