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

プロパティまたはメンバー変数の1つは、割り当てが解除されたディクショナリであるか、ディクショナリが含まれています。過剰にリリースされている属性付き文字列に属性ディクショナリを設定しているコードがある可能性があります。

最終的に、強調表示しているコードは、過剰にリリースされたオブジェクトを識別していますが、クラッシュしているコードではありません。オブジェクトが過剰に解放されている場所を見つける必要があります。このクラッシュを特定するには、Xcodeパフォーマンスツール、特にゾンビーズツールを使用することをお勧めします。ただし、これはシミュレーターであるため、ゾンビツールを使用するには、シミュレーターで再現可能である必要があります。

于 2012-05-20T23:41:35.723 に答える