0

次の問題があります。指定されたサイズの円を描画し、グラデーションで塗りつぶす必要がある独自のクラスを作成しています。

私はNSBezierPathである円で作成しました.これにグラデーションを描画します

[gradient drawInBezierPath:circle relativeCenterPosition:gradPoint]

したがって、1 つのことを除いてすべてがうまく機能します: drawRect: コードの最後で次のコマンドを実行するとき:

[borderColor set]; 
[circle stroke];

エラーが発生します: (Program recieved signal: "EXC_BAD_ACCESS") デバッガーは次の行を指します

[borderColor set];

私はborderColorを次のように設定しました

[NSColor colorWithCalibratedRed:0.8 green:0.8 blue:0.8 alpha:1.0]

例えば。

これは、borderColor を定義済みの色 (blackColor、clearColor、greenColor) に設定した場合にのみ正常に機能します。しかし、手動で設定しようとするとクラッシュします。

色に関する制限や、そのような問題を引き起こす可能性のあるものについて誰かが知っていますか? BezierPath のストロークの色について特別なことは何も見つかりませんでした。

ありがとうございました。

4

1 に答える 1

1

borderColor問題は、インスタンス変数を適切に保持していないことです。この-colorWithCalibratedRed:green:blue:alpha:メソッドは、自動解放されたオブジェクトを作成します。このオブジェクトは、保持しない限り、アプリケーション イベント ループが戻ると、自動的に自動解放 (および割り当て解除) されます。次回、割り当てを解除したオブジェクトにメッセージを送信しようとすると、問題が発生します。

-blackColor、などで動作する理由-clearColorは、純粋な運 (一種) です。これらの「便利な色」メソッドは、割り当てが解除されることのないシングルトン インスタンスを返すことがあります。たとえば、誰かが-blackColor1000 回要求した場合、1,000 個の個別のインスタンスを作成してメモリを浪費しても意味がありません。代わりに、単一の (共有) インスタンスが返されます。ただし、これは一般的に依存すべきではない非公開の実装の詳細です。

これを修正する方法は、 がどのようborderColorに定義されているかによって異なります。プロパティとして定義および実装されていて、-setBorderColor:メソッドを介して設定している場合は、プロパティが保持として定義されていることを確認してください。

@property (retain) NSColor *borderColor;

または、インスタンス変数を直接操作して borderColor 値を設定している場合は、retain でラップする必要があります。

// remember to safely release the old value if necessary 
borderColor = [[NSColor colorWithCalibratedRed:0.8
                        green:0.8 blue:0.8 alpha:1.0] retain];
于 2011-03-12T01:17:06.093 に答える