Objective c CFDictionary objectForKey消息已发送到解除分配的实例

Objective c CFDictionary objectForKey消息已发送到解除分配的实例,objective-c,ios,runtime-error,Objective C,Ios,Runtime Error,有人知道为什么会这样吗 该错误明确表示它正在尝试访问已解除分配的字典的objectForKey。但是在堆栈跟踪中,我没有看到任何字典。这怎么可能 下面是代码: -(CGSize)sizeConstrainedToSize:(CGSize)maxSize fitRange:(NSRange*)fitRange { CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStri

有人知道为什么会这样吗

该错误明确表示它正在尝试访问已解除分配的字典的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);

除此之外。

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


最终,您高亮显示的代码是识别过度释放的对象,而不是崩溃代码。您需要找到对象被过度释放的位置。我建议使用Xcode性能工具,特别是Zombies工具来识别此崩溃。它只是模拟器,因此需要在模拟器中复制才能使用zombies工具。

其中一个属性或成员变量是或包含已解除分配的字典。您可能有代码在过度释放的属性字符串上设置属性字典


最终,您高亮显示的代码是识别过度释放的对象,而不是崩溃代码。您需要找到对象被过度释放的位置。我建议使用Xcode性能工具,特别是Zombies工具来识别此崩溃。它只是模拟器,因此需要在模拟器中复制才能使用zombies工具。

抱歉..我现在将其添加为文本抱歉..我现在将其添加为文本我在此处启用了NSZombiesenable,因此这是正在发布的NSCache。。如果我这样做:@implementation-NSCache(SharedCache)+(NSCache*)SharedCache;{static NSCache*sharedCache=nil;if(sharedCache==nil){sharedCache=[[self alloc]init]retain];[sharedCache setCountLimit:0];}return sharedCache;}我很高兴您找到了它,不过您可能想进一步了解为什么需要双重保留NSCache。不是说你的解决方案不起作用或不对,我只是觉得这个谜团没有解开。我已经在这里启用了NSzombisenabled,所以这是NSCache正在发布。。如果我这样做:@implementation-NSCache(SharedCache)+(NSCache*)SharedCache;{static NSCache*sharedCache=nil;if(sharedCache==nil){sharedCache=[[self alloc]init]retain];[sharedCache setCountLimit:0];}return sharedCache;}我很高兴您找到了它,不过您可能想进一步了解为什么需要双重保留NSCache。并不是说你的解决方案不起作用或不对,我只是觉得这个谜团还没有解开。