2010-07-18 3 views
2

Я пытаюсь установить свойство, как так -Попытка получить значение CGColor из свойства вызывает сбой

-interface:

@property (readwrite, assign) CGColorRef otherBallColor; 

-someMethod:

CGColorRef ballColor = [UIColor colorWithRed:255.0/256.0 green:165.0/256.0 blue:239.0/256.0 alpha:1.0].CGColor; 
[self setOtherBallColor:ballColor]; 

Как в скором времени, когда я попытаюсь получить доступ к значению, которое он сработает -

-someOtherMethod (drawRect в этом случае):

CGContextSetFillColorWithColor(context, otherBallColor); 

Но если в "SomeMethod" Я -

CGColorRef ballColor = [UIColor blueColor].CGColor; 

... все это прекрасно работает. Может ли кто-нибудь объяснить, что происходит?

Большого спасибо (PS, совершенно новый для Objective-C, Тхо не программирование вообще)

+4

Вы должны разделить на 255 вместо 256. – kennytm

ответ

5

Вы должны сохранить вернулись CGColor, ваш [UIColor colorWith ...] создает экземпляр авто выпущено, поэтому, когда он выходит за рамки (автореализованный я имею в виду), также выделяется соответствующий CGColor.

Я бы рекомендовал использовать UIColor вместо CGColorRef, если в этом случае возможно.

+1

... и использовать CGColorRetain вместо '-retain'. – kennytm

+0

Спасибо - я только что попробовал варианты этого, в том числе: UIColor * ballUIColor = [[UIColor colorWithRed: 255.0/256.0 зеленый: 165.0/256.0 синий: 239.0/256.0 alpha: 1.0] сохранить]; [self комплектOtherBallColor: ballUIColor.CGColor]; [ballUIColor release]; ... И он по-прежнему падает, когда я получаю доступ к значению в drawRect. Я немного тупик ... (также попробовал авторейтинг безрезультатно) – SomaMan

+0

Да, или (что я лично предпочитаю) используйте объект более высокого уровня, где это возможно. Классы UI/NS выглядят лучше, читают проще, и в большинстве случаев их легче управлять – Gobra

1

Говорите о позднем ответе, но у меня есть альтернативное решение этой конкретной проблемы, с которой я столкнулся немного назад. Я нашел этот вопрос до решения, поэтому я решил, что брошу свои два цента. Оказывается, что UIColor имеет метод экземпляра под названием setFill, который устанавливает приемник как текущий цвет заполнения контекста. Таким образом, вы могли бы написать:

CGContextRef myContext = UIGraphicsGetCurrentContext(); 
[[UIColor colorWithRed:255.0/255.0 green:165.0/255.0 
        blue:239.0/255.0 alpha:1.0] setFill]; 
CGContextFillPath(myContext); 

Я нахожу это более чистое решение, потому что вам не придется беспокоиться о сохранении или впоследствии выпускать любые CGColor с. Фактически, вам даже не нужно иметь дело с командами настройки цвета заливки Core Graphics, например CGContextSetFillColorWithColor.

Вы можете проверить метод - (void)setFill более подробно в UIColor Apple documentation.