2012-05-06 2 views
0

У меня есть UIColor, определенный как это:Почему использование #define UIColor как CGColorRef вызывает сбои?

#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); 

У меня нет сбоя, и он отлично работает. Что является причиной этого?

ответ

3

Причина, по которой она падает, из-за проблем с областью. Что вы делаете:

  1. Создать новый объект UIColor
  2. Получить его указатель CGColor
  3. Put этого указатель в новый переменный
  4. Release объект UIColor (следующую строку ...)
  5. Используйте указатель CGColor, который указывает на плохие данные уже

Когда вы делаете это в «одну строку версии», что вы это:

  1. Создать новый объект UIColor
  2. Извлечь его указатель CGColor
  3. Используйте указатель CGColor в функции
  4. Освободить объект UIColor (Следующая строка ...)

Так как вы создаете объект в той же строке, где вы его используете, компилятор автоматически сохраняет объект до тех пор, пока вызов функции не вернется и не перейдет к следующей строке. Только тогда он освобождает объект.

Но когда вы устанавливаете переменную CGColor в переменную, происходит то, что компиляторы видят, что объект нигде не будет использоваться и отправляет выпуск. Но CGColor не является NSObject, и компилятор не отправляет «сохранить» в CGColor.

Если вам нужна CGColor в переменной, вы можете использовать CGColorRetain.

CGColorRef shadowColorRef = CGColorRetain(kCircleInnerShadowColor.CGColor); 

И тогда, когда вы закончите с этим, CGColorRelease

+2

Это, по сути, «интерьер указатель» проблема (именно так, как Даниил описывает). Потенциально лучшее решение, если этот цвет используется * много *, должен иметь глобальную переменную вместо #define, чтобы избежать большого количества трафика памяти. – bbum

+0

Как создать глобальную переменную UIColor? – Snowman

+0

Какая линия освобождает CGColorRef? – Snowman

Смежные вопросы