0

私は次のように定義されたUIColorを持っています:

#define kCircleInnerShadowColor [UIColor colorWithWhite:.78 alpha:1.0]

それから私はそれをこのように使います:

CGColorRef shadowColorRef = kCircleInnerShadowColor.CGColor;
CGContextSetShadowWithColor(cxt, size, 0, shadowColorRef);

ただし、これによりBAD_ACCESSがクラッシュします。私が代わりにやるなら

CGContextSetShadowWithColor(cxt, size, 0, kCircleInnerShadowColor.CGColor);

クラッシュすることはなく、正常に動作します。これの理由は何ですか?

4

1 に答える 1

3

クラッシュする理由は、スコープの問題が原因です。あなたがしていることは:

  1. 新しいUIColorオブジェクトを作成します
  2. CGColorポインタを取得する
  3. そのポインタを新しい変数に入れます
  4. UIColorオブジェクトを解放します(次の行...)
  5. すでに不良データを指しているCGColorポインターを使用します

「1行バージョン」でそれを行うとき、あなたがすることは次のとおりです。

  1. 新しいUIColorオブジェクトを作成します
  2. CGColorポインタを取得する
  3. 関数でCGColorポインターを使用する
  4. UIColorオブジェクトを解放します(次の行...)

したがって、オブジェクトを使用するのと同じ行にオブジェクトを作成するため、コンパイラーは、関数呼び出しが戻って次の行に進むまで、オブジェクトを自動的に保持します。その後、オブジェクトを解放します。

しかし、CGColorを変数に設定すると、コンパイラーはオブジェクトがどこでも使用されないことを認識し、リリースを送信します。ただし、CGColorはNSObjectではなく、コンパイラはCGColorに「保持」を送信しません。

変数にCGColorが必要な場合は、CGColorRetainを使用することをお勧めします

CGColorRef shadowColorRef = CGColorRetain(kCircleInnerShadowColor.CGColor);

そして、それが終わったら、CGColorRelease

于 2012-05-06T15:32:05.237 に答える