1

iOS アプリ (私UIControlは iOS 4.3 を使用しています) にサブクラスがあり、サブクラスの一部は「setButtonColor:(UIColor)bc」というメソッドです。コードからこのメソッドを呼び出すと、問題なく動作します...ただし、greenColor や redColor などの組み込みの色を使用する場合のみです。「colorWithRed:green:blue:alpha,」を使用して独自の色を作成すると、コンソールに次のメッセージが表示されてクラッシュします。

-[UIDeviceRGBColor set]: message sent to deallocated instance 0x4e61560

setButtonColor: メソッドは次のとおりです。

-(void)setButtonColor:(UIColor *)bc{
    buttonColor = bc;
    [self setNeedsDisplay];
}

を削除setNeedsDisplayしてもクラッシュしませんが、ボタンの色は本来のように変わりません。なぜこれが起こっているのかについて洞察を持っている人がいれば、本当に感謝します。詳細が必要な場合は、尋ねてください.

編集:もう少し調べてみました。-drawRect メソッドでは、[buttonColor セット] を呼び出します。それをコメントアウトすると、クラッシュしなくなりますが、ボタンの色も変わりません。

前もって感謝します、

しんしん

4

1 に答える 1

3

ARCを使用していないと思います。

保持せずに設定すると、現在のプールがフラッシュbuttonColor = bcされると、buttonColor はダングリング ポインターになります (他の場所に保持されていないと仮定します)。autorelease

[self setNeedsDisplay] は drawRect: を呼び出します。後でその時点で、buttonColor が既に割り当て解除されている可能性があり、それを参照するとアプリがクラッシュします。

静的な色でクラッシュしない理由は、後で再利用するために UIKit がこれらの所有権を保持しているためです。

bc に設定した後に buttonColor を保持することにより、所有権を保持して、drawRect: に対して引き続き有効にします。

于 2012-07-03T20:07:22.930 に答える