Intereting Posts
Невозможно зарегистрироваться для push-уведомлений при использовании только производственного сертификата Как правильно подкласс SKNode, когда нет метода init? Максимальное количество файлов в ipa или apk ios – все изображения с помощью Haneke мерцают при перезагрузке данных Есть ли способ очистить кеш SFSafariViewController? Проблема с выпуском Linphone IOS Горизонтальная прокрутка в файлах PDF со встроенными функциями словаря по умолчанию в Swift Ячейка UITableView отображает неправильное изображение даже при установке изображения на нуль в качестве первого шага в tableView.dequeueReusableCell Отправить запрос HTTPS в XCode (iOS) Масштабирование проблемы при сохранении UIImage как NSData Как установить автоматическую высоту для UITableView? Добавить элементы в существующий ключ в NSDictionary, сохраненный в plist Динамический компаратор в NSPredicate Облицовка и изменение размера ячейки в UICollectionView NSDictionary в 1 NSMutableArray

получение EXC_BAD_ACCESS при установке приложения в устройстве, основной графикой

Я делаю это, чтобы нарисовать простой прямоугольник и задать цвет для окрашенной области

// Just added @interface Gradient () { CGColorRef lightBlueColor; } @implementation Gradient -(id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.backgroundColor = [UIColor lightGrayColor]; NSLog(@"frame is %@",NSStringFromCGRect(self.frame)); NSLog(@"bound is %@",NSStringFromCGRect(self.bounds)); lightBlueColor = [UIColor colorWithRed:105.0f/255.0f green:179.0f/255.0f blue:216.0f/255.0f alpha:1.0].CGColor; } return self; } -(void) layoutSubviews { paperRect = CGRectMake(10, 10, self.bounds.size.width/2, self.bounds.size.height/2); } -(void)drawRect:(CGRect)rect { //Draw a retangle CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(context, lightBlueColor); CGContextFillRect(context, paperRect); } 

Ниже показано, что отображается на симуляторе

введите описание изображения здесь

Однако, когда я пытаюсь установить на устройство, я получаю EXC_BAD_ACCESS введите описание изображения здесь

Вопрос:

почему он не работает на устройстве. Я сделал ошибку где-то

Изменить: я только что попробовал изменить lightBlueColor

lightBlueColor = [UIColor blueColor] .CGColor;

Затем я могу запустить приложение на устройстве. Я вообще не понимаю

Изменить: так что вы просто столкнулись с проблемой управления памятью. Теоретически, в обоих случаях программа могла быть разбита. Зачем? Поскольку в соответствии с документацией, -[UIColor lightBlueColor] и сопровождающие его методы класса возвращают объект с автореализацией. На практике, по соображениям оптимизации, это неверно: на самом деле они возвращают один и тот же инициализированный одноранговый номер, чтобы сохранить память. Эта оптимизация возможна, потому что они всегда возвращают один и тот же цвет. Поскольку общий экземпляр (singleton color) был создан без автоматического оповещения, он не освобождается, когда вы этого не ожидаете, поэтому программа работала. Если бы программисты Apple не были достаточно умны, чтобы сделать эту оптимизацию, обе программы потерпели бы крах.

Но во втором случае метод colorWithRed:green:blue:alpha: не может быть такой оптимизации, так как не гарантируется, что он всегда возвращает тот же цвет. (Представьте себе, что произойдет, если вы позвонили ему, чтобы сначала получить красный цвет, затем он его кешировал, тогда вы хотели получить синий цвет, но он вернул бы кешированный красный.) Таким образом, он фактически создает новый экземпляр цвет и автореализует его. Но так как вы его не сохраняете, вскоре он освобождается из-за автореферата и, следовательно, его свойство CGColor недействительно. Таким образом, существует три возможных решения:

Один. Я бы предпочел это. Сделайте lightBlueColor экземпляра UIColor объектом UIColor и создайте ее, используя

 lightBlueColor = [[UIColor alloc] initWithRed:r green:g blue:b alpha:a]; 

то просто используйте его свойство CGColor для рисования.

Два. Подобно первому, но вы можете создать цветной объект как

 lightBlueColor = [[UIColor colorWithRed:r green:g blue:b alpha:a] retain]; 

также, однако, я бы сказал, что это неправильная концепция.

Три: вы можете заставить объект UIColor исчезнуть в глубокой скважине пулов автоопределения, но сохраните CGColor безопасности:

 lightBlueColor = CGColorRetain([UIColor colorWithRed:r green:g blue:b alpha:a].CGColor); 

В каждом случае вы должны обратить внимание на управление памятью в методе dealloc .

Извлеченный урок: переменные экземпляра не подходят для хранения объектов с автореализацией. Вы хотите назначить-init и отпустить, когда это необходимо.

Ваша проблема связана с управлением памятью. Вы не вызываете CGColorRetain на lightBlueColor в методе init . UIColor blueColor всего, это работает для UIColor blueColor потому что этот цвет является постоянным, поддерживаемым ОС. Ваш цвет не настолько, что он выходит из сферы действия и освобождается.

Как только вы это добавите, не забудьте вызвать CFColorRelease в dealloc или в любом другом подходящем месте по мере необходимости.