Какао NSBezierPath - инсульт. Сбои с цветом, отличным от предопределенного - PullRequest
0 голосов
/ 12 марта 2011

У меня следующая проблема.Я пишу свой собственный класс, который должен нарисовать круг указанного размера, заполнить его градиентом.

Я сделал это с помощью круга, являющегося NSBezierPath, к которому я рисую свой градиент, используя

[gradient drawInBezierPath:circle relativeCenterPosition:gradPoint]

Так что все отлично работает, кроме одной вещи: когда я выполняю следующую команду в конце моего drawRect: code:

[borderColor set]; 
[circle stroke];

Я получаю ошибку: (Программа получила сигнал: "EXC_BAD_ACCESS") иотладчик указывает на строку с

[borderColor set];

Я устанавливаю borderColor, например, как

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

.

Работает нормально, только если я установил свой borderColor в качестве любого предопределенного цвета: черный цвет, прозрачный цвет, зеленый цвет.Но любой, который я пытаюсь установить вручную, вылетает.

Кто-нибудь знает о каких-либо ограничениях на цвета или что-то, что может вызвать такую ​​проблему?Я не нашел ничего особенного в цвете обводки BezierPath.

Спасибо.

1 Ответ

1 голос
/ 12 марта 2011

Проблема в том, что вы неправильно сохраняете переменную экземпляра borderColor.Метод -colorWithCalibratedRed:green:blue:alpha: создает объект с автоматическим освобождением, который, если вы не сохраните его, будет автоматически освобожден (и освобожден), как только цикл событий приложения вернется.В следующий раз, когда вы попытаетесь отправить сообщение освобожденному объекту, возникнут проблемы.

Причина, по которой он работает с -blackColor, -clearColor и т. Д., - чистая удача (своего рода).Эти методы «удобного цвета» возвращают единичные экземпляры, которые никогда не будут освобождены.Например, если кто-то запрашивает -blackColor 1000 раз, нет смысла тратить память на создание 1000 отдельных экземпляров;вместо этого возвращается один (общий) экземпляр.Однако это частная реализация, на которую обычно не следует полагаться.

Как это исправить, зависит от того, как было определено borderColor.Если оно определено и реализовано как свойство, и вы устанавливаете его с помощью метода -setBorderColor:, убедитесь, что свойство определено как retain:

@property (retain) NSColor *borderColor;

Или, если вы устанавливаетеЗначение borderColor, работая с переменной экземпляра напрямую, следует обернуть его с сохранением:

// remember to safely release the old value if necessary 
borderColor = [[NSColor colorWithCalibratedRed:0.8
                        green:0.8 blue:0.8 alpha:1.0] retain];
...