Проблема в том, что вы неправильно сохраняете переменную экземпляра 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];