2

こんばんは、

作成したこの新しいアプリはほぼ完成し、アプリストアに送信する前にいくつかの最終テストを行っていましたが、何かが起こって本当に困惑しました。ビューコントローラの1つに、UITableViewを使用しているため、

 -(UIView*) tableView:(UITableView*) tableView viewForHeaderInSection:(NSInteger) section

UITableViewDelegateプロトコルのメソッド。これにより、ヘッダーに独自のカスタムビューを提供できます。(はい、UITableViewDataSourceプロトコルにも準拠し、それに必要なすべてのメソッドを提供しました)

そこで、独自のUIViewクラスを作成し、独自のカスタムビューを描画するためのdrawRect:メソッドを実装しました。これをiPad6.0とiPhone6.0の両方のシミュレーターで実行すると、完全に正常に実行されます。

ただし、自分のiOSデバイス(iOS 6を実行している)を接続すると、クラッシュしてEXC_BAD_ACCESSがスローされます。

いくつかのブレークポイントを実行したところ、実際のデバイスでアプリを実行すると、コードはここまでしか実行されないことがわかりました。

    // This code is the beginning of my drawRect method for my custom view
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGColorRef lightBlue = [UIColor colorWithRed:72.0/255.0
                                      green:121.0/255.0      
                                      blue:201.0/255.0 alpha:1].CGColor;

    CGColorRef cream = [UIColor colorWithRed:235.0/255.0 
                            green:235.0/255.0
                            blue:235.0/255.0 alpha:1].CGColor;
    CGContextSetFillColorWithColor(context,cream);
    CGContextFillRect(context, _paperBox); 
     // the _paperBox variable was defined earlier as CGRect _paperBox
     // the _paperBox variable was given a value in the -(void)layoutSubviews method

    CGColorRef shadow = [UIColor colorWithWhite:.5 alpha:.5].CGColor;
    CGContextSetShadowWithColor(context, CGSizeMake(0,3), 2, shadow);
    CGContextSetFillColorWithColor(context, lightBlue);

    // and later on I setup some code to draw a linear gradient:

    NSArray colors = [NSArray arrayWithObjects:(__bridge id) lightBlue,
                                                 (__bridge id) cream,
                                                 nil];

EXC_BAD_ACCESSは、その最後の行で発生します。シミュレータではなく、実際のiOSデバイスで実行している場合にのみこれが発生するのはなぜですか?

ありがとう、

4

1 に答える 1

1

私は自分の質問に対する答えを見つけました。うまくいけば、これを読んで同じ問題を抱えていた他の誰かが、この回答が役立つと思うでしょう. ARC と新しい __bridge 修飾子のリリースにより、私の古いキャストは次のようになります。

    (__bridge id) 

各 CGColorRef は、新しい ARC 用語では技術的に「正しく」ありませんでした。また、新しい __bridge の概念にあまり慣れていないため、UIColor ごとに CGColorRef を作成するのではなく、CGColor をキャストすることで修正しました。次のように、各 UIColor のプロパティを配列内の id に設定します。

    NSArray* array = [NSArray arrayWithObjects:
    (id)[UIColor whiteColor]CGColor],
    (id)[[UIColor colorWithRed:235.0/255.0 
    green:235.0/255.0 blue:235.0/255.0]CGColor],nil];

これは私にとってはうまくいくようでした。ただし、新しい __bridge 修飾子にまだ慣れていないすべての人に、ARC を使用するときにそれらを学習することをお勧めします (私も含めて)。

みんな、ありがとう!

于 2012-12-31T03:48:41.523 に答える