2

もう何が起こっているのかわかりません。EXC_BAD_ACCESSの原因となっているこの特定のコード行で何が起こっているのかを理解するために、私は非常に多くのことを試みました。NSZombiesを有効にしてみましたが、役に立ちませんでした。コードは次のとおりです。

- (int)linesFromText:(NSString *)string withFont:(UIFont *)font andSize:(CGSize)size {
    NSArray *splitString = [string componentsSeparatedByString:@" "];
    NSMutableArray *allLines = [NSMutableArray array];
    NSMutableString *line = [NSMutableString string];
    NSString *word;
    NSString *fakeLine;
    for (int i = 0; i < splitString.count; i++) {

        word = [splitString objectAtIndex:i];
        fakeLine =  [NSString stringWithFormat:@"%@%@ ",line, word];
        //NSLog(@"line %@, font %@",fakeLine,font);

        ////THIS IS THE LINE CAUSING THE EXC_BAD_ACCESS
        CGSize lineSize = [fakeLine sizeWithFont:font];

        if (lineSize.width <= size.width) {
            [line appendFormat:@"%@ ", word];
        } else {
            [allLines addObject:[line stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]];
            line = [NSMutableString string];
            [line appendFormat:@"%@ ", word];
        }


    }
    [allLines addObject:[line stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]];
    return allLines.count;
}

これは私を夢中にさせています。なぜなら、私が作成したアプリで何日もスクロールして高速化したときにのみ、新しいiphone5で発生するからです。ストア内のアプリケーションへのリンクは次のとおりです。

http://itunes.apple.com/us/app/id543324451?mt=8

あなたがiphone5を持っているなら、あなたは私が何を意味するかを見ることができます。iphone4はこれを行いません。

このコードはUITableViewCellのlayoutSubviewsで呼び出され、TTTAttributedLabel(https://github.com/mattt/TTTAttributedLabel)を使用するカスタム属性ラベルのフレームのサイズを決定するのに役立ちます。

また、「Gaurd mallocを有効にして詳細を表示しようとしましたが、XCodeで次のエラーが発生します。

dyld:画像が見つからないため、挿入されたライブラリ'/usr/lib/libgmalloc.dylib'を読み込めませんでした

/ usr / libを見ると、そのファイルは同じディレクトリに存在するファイルへのシンボリックリンクです:libgmalloc.dylib-> libgmalloc.B.dylib

私はここでアイデアが不足していて、UIFontがすぐにリリースされてから利用できなくなる可能性があると考えたので、UITableViewCellに参照を入れて、そのセルの寿命が尽きるまでUIFontを保持します。

私もインターネットを検索しましたが、この詳細についてはあまり見つかりませんでした。

また、デバッガーからのスタックトレースの画像もあります。

http://i.stack.imgur.com/gWC5L.png

何か案は?十分な情報を提供しましたか?

ありがとう

4

1 に答える 1

0

私はあなたの質問がここで答えられると思います:

UIStringDrawingメソッドはiOS6ではスレッドセーフではないようです

短いバージョン:sizeWithFont、および他のほとんどのUIKitメソッドは、画面上で使用している場合(事前レンダリングに使用するのではなく)、スレッドセーフではありません。

良いニュース:そのスレッドでAdamSwindenの答えを見てください。彼は、UIKitの代わりにCoreTextを使用してiOS6で同じ結果を得る方法を説明しています。

于 2012-10-19T17:57:17.157 に答える