質問
カスタムUITableViewCellのための私の描画ルーチンでは、何の問題もなく、次を使用していた。
CGContextRef context = UIGraphicsGetCurrentContext();
UIColor* backgroundColor = [UIColor colorForHex:@"FFFEFF"];
[backgroundColor set];
CGContextFillRect(context, rect);
もちろん、これは、0〜255のRGB値に文字列や休憩、このダウンを取り、以下の(aは1.0Fにデフォルト設定されてUIColorオブジェクトを返しますcolorForHexためUIColorオブジェクトの私のインターフェイスを除いてはかなり標準です):
return [UIColor colorWithRed:((float) r/255.0f) green:((float) g/255.0f) blue:((float) b/255.0f) alpha:a];
さて、これは正常に動作しますが、私はこれを改善し、可能な限り描画ルーチンをスピードアップしようとする色(とフォント)の作成を集中しようとしました。私は問題を取得する場所です。
私が使用してプロトコルを作成します:
@protocol ItemListTableViewCellDelegate
-(UIFont*) fontForId:(int) fontID;
-(UIColor*) colorForId:(int) colorID;
@end
コントローラは、このプロトコルを実装しようcolorForId方法を実現
-(UIColor*) colorForId:(int) colorID {
UIColor* requestedColor = nil;
switch (colorID) {
case BACKGROUND_COLOR_ID:
{
requestedColor = backgroundColor;
}
break;
}
return requestedColor;
}
のbackgroundColorは、コントローラのinitWithStyle方法でUIColor *として制御装置の部材として作成されます。これは、呼び出されているとのbackgroundColorが作成されている。
セルは、セルが呼び出すことができるようにコントローラに初期化されるNSObject<ItemListTableViewCellDelegate>* cellDelegate
部材を有する
UIColor* backgroundColor = [cellDelegate colorForId:BACKGROUND_COLOR_ID];
コントローラにUIColorに正しいポインタを返すように見えますが、「セット」セルdrawメソッドでこの色に呼び出されたときにセルがBADアクセスエラーがスローされますと、私がなぜうまくいかないことができました。
右方向に任意のポインタ?
解決
どのEXC_BAD_ACCESSエラーの場合には、通常リリースのオブジェクトにメッセージを送信しようとしています。これらを追跡するための BEST の方法は NSZombieEnabled の使用です。
これは実際にオブジェクトを解放することはありませんで動作しますが、それは正常に解放されていたであろうと言うこと、「ゾンビ」としてそれをラップし、その中にフラグを設定することもできます。あなたが再度アクセスしようとすると、この方法では、それはまだあなたがエラーをした前にそれが何だったか知っている、との情報のこの少しで、あなたは通常、問題が何であったか確認するために後戻りすることができます。
デバッガは時々任意の有用な情報にアウトクラップスときこれは、特にバックグラウンドスレッドに役立ちます。
注することが非常に重要しかし、あなたが100%に必要であることのはこれが唯一のあなたのデバッグコードではなく、あなたのディストリビューションのコードであることを確認してください。何が今までリリースされていないので、あなたのアプリが漏れると、漏れてリークします。これを行うために私に思い出させるために、私は私のappdelegateにこのログを入れます:
if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");