Подтвердить что ты не робот

- [Не сохранять тип]: сообщение отправлено на освобожденный экземпляр

Я конвертировал свое приложение для использования 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

Есть идеи, как его решить?

4b9b3361

Ответ 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);