- [Не сохранять тип]: сообщение отправлено на освобожденный экземпляр
Я конвертировал свое приложение для использования ARC.
До того, как появилась следующая строка кода:
NSArray *colors = [NSArray arrayWithObjects:startColor, endColor, nil];
Поскольку неявное преобразование типа указателя не Objective-C в 'id' не разрешено с помощью ARC, я переписал строку следующим образом:
NSArray *colors = [NSArray arrayWithObjects:(__bridge id)startColor, (__bridge id)endColor, nil];
Все работает отлично на симуляторе, однако на устройстве приложение вылетает из указанной строки с сообщением об ошибке:
-[Not A Type retain]: message sent to deallocated instance
Есть идеи, как его решить?
Ответы
Ответ 1
Этот мостовой состав может не работать, поскольку в этом вопросе этой темы форума разработчиков Apple, но это было неправильное понимание того, как управлять временем жизни эти CGColorRefs.
Один из способов, которым это будет работать, - использовать встроенный мостик, предоставляемый методом -CGColor
в UIColor. Вместо сохранения вашего CGColor во временную переменную, как вы это делаете выше, вы должны использовать что-то вроде следующего:
NSArray *colors = [NSArray arrayWithObjects:(id)[color1 CGColor],
(id)[color2 CGColor], nil];
с color1
и color2
- экземплярами UIColor.
Модификация позаботится о вас методом -CGColor
в соответствии с "Компилятор обрабатывает CF-объекты, возвращенные из Cocoa Методы" раздела Переход к заметкам о выпуске ARC. В документации в настоящее время отсутствует листинг в id, который у меня выше, что требуется для его компиляции.
Я тестировал это, и, похоже, он работает в моем случае, сопоставляя то, что Бен сообщает в связанном с разработчиком потоке форумов.
В дополнение к вышесказанному вы можете явно сохранить и освободить CGColorRefs, возвращенные с помощью метода -CGColor
, и соединить их в NSArray, снова, как показано на рисунке здесь.
Ответ 2
Изменить:
Если вы используете свойство UIColor CGColor, CGColor исчезнет с момента последней ссылки на экземпляр UIColor. Чтобы избежать этого, "мостите" свои цвета непосредственно в вызове функции:
NSArray *colors = [NSArray arrayWithObjects:[uiStartColor CGColor], [uiEndColor CGColor], nil];
Этот метод описан в документации Apple
Оригинал:
попробуйте присвоить переменную: id color = (__bridge_transfer id)CGColorCreate(...);
и ничего не делать с прямым возвратным значением CGColorCreate()
Ответ 3
Спасибо @Brad за подсказку -CGColor!
моя ошибка приложения в следующей строке, которая будет вызвана объектом NSInvocation.
CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
обходной путь определяет свойство цвета и использует его вместо.
@property(strong, nonatomic) UIColor *backgroundColor;
......
self.backgroundColor = [UIColor whiteColor];
......
CGContextSetFillColorWithColor(context, self.backgroundColor.CGColor);