1

私がやっていることは、単純な長方形を描き、ペイントされた領域の色を設定することです

   // Just added
    @interface Gradient () {
       CGColorRef  lightBlueColor;
   }
    @implementation Gradient

    -(id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            self.backgroundColor   =   [UIColor lightGrayColor];
            NSLog(@"frame is %@",NSStringFromCGRect(self.frame));
            NSLog(@"bound is %@",NSStringFromCGRect(self.bounds));
            lightBlueColor         =   [UIColor colorWithRed:105.0f/255.0f green:179.0f/255.0f blue:216.0f/255.0f alpha:1.0].CGColor;

        }
        return self;
    }

    -(void) layoutSubviews {
        paperRect =   CGRectMake(10, 10, self.bounds.size.width/2, self.bounds.size.height/2);
    }

    -(void)drawRect:(CGRect)rect {

        //Draw a retangle
        CGContextRef        context     =   UIGraphicsGetCurrentContext();

        CGContextSetFillColorWithColor(context, lightBlueColor);
        CGContextFillRect(context, paperRect);  


    }

以下はシミュレーターに表示されるものです

ここに画像の説明を入力してください

ただし、デバイスにインストールしようとすると、EXC_BAD_ACCESSが発生します ここに画像の説明を入力してください

質問 :

デバイスで機能しない理由。どこかで間違えましたか

編集:lightBlueColorを変更しようとしました

lightBlueColor = [UIColor blueColor] .CGColor;

次に、デバイスでアプリを実行できます。まったくわからない

4

2 に答える 2

3

編集:メモリ管理の問題が発生しました。理論的には、どちらの場合も、プログラムがクラッシュした可能性があります。なんで?ドキュメント-[UIColor lightBlueColor]とそれに付随するクラスメソッドによると、自動解放されたオブジェクトが返されるためです。実際には、最適化の理由から、それは真実ではありません。実際、メモリを節約するために、同じ割り当てによって開始されたシングルトンを返します。これらは常に同じ色を返すため、この最適化が可能です。共有インスタンス(シングルトンカラー)は自動リリースなしで作成されているため、予期しないときに突然リリースされることはありません。そのため、プログラムは機能しました。Appleのプログラマーがこの最適化を行うのに十分賢くなかったら、両方のプログラムがクラッシュしていたでしょう。

ただし、2番目のケースでは、colorWithRed:green:blue:alpha:常に同じ色が返されることが保証されていないため、メソッドでこの最適化を行うことはできません。(最初に赤色を取得するために呼び出し、次にキャッシュし、次に青色を取得したいが、キャッシュされた赤色を返すとどうなるか想像してみてください。)したがって、実際には、の新しいインスタンスが作成されます。色を付けて自動リリースします。ただし、保持しないため、自動解放のためにすぐに割り当てが解除され、そのCGColorプロパティも無効になります。したがって、3つの可能な解決策があります。

1。私はこれが好きです。インスタンスlightBlueColor変数をUIColorオブジェクトにし、を使用して作成します

lightBlueColor = [[UIColor alloc] initWithRed:r green:g blue:b alpha:a];

次に、そのCGColorプロパティを描画に使用します。

二。最初のものと似ていますが、カラーオブジェクトを次のように作成できます。

lightBlueColor = [[UIColor colorWithRed:r green:g blue:b alpha:a] retain];

しかし、これも間違った概念だと思います。

3:自動解放プールの深い井戸でUIColorオブジェクトを消滅させることができますが、CGColor安全を確保してください。

lightBlueColor = CGColorRetain([UIColor colorWithRed:r green:g blue:b alpha:a].CGColor);

いずれの場合も、メソッドのメモリ管理に注意を払う必要がありますdealloc

教訓:インスタンス変数は、自動解放されたオブジェクトの保存には適していません。必要に応じて、alloc-initとreleaseを実行します。

于 2012-10-20T06:04:35.747 に答える
1

あなたの問題はメモリ管理の1つであるようです。CGColorRetainメソッドでlightBlueColorを呼び出さないでくださいinitUIColor blueColorその色はOSによって一定に保たれているため、これはおそらく機能します。あなたの色はそうではないので、それは範囲外になり、割り当てが解除されます。

それを追加したら、必要に応じて電話またはその他の適切な場所に電話CFColorReleaseすることを忘れないでください。dealloc

于 2012-10-20T06:22:49.593 に答える