Intereting Posts
Как нарисовать две параллельные полосы в UITableViewCell Как использовать AFNetworking 2.0 в iOS5? Разница между зеркальным отражением в эфире и без зеркалирования iOS. Нужно ли повторно отправлять покупки в приложении после отказа от двоичного кода? Как ограничить ранее доступные функции при покупке InApp Точность временной отметки местоположения в ios Получение разного UUID на одном устройстве с iOS версии 10.2 AVAssetWriterInput не генерирует целое видео при добавлении CMSampleBuffer Подождите, пока фоновый селектор не будет завершен, чтобы вызвать новый метод Встроенный двоичный файл не подписан с тем же сертификатом Формат даты в Iphone Как окрашивать непрозрачные текстурные части SKSpriteNode с помощью Swift Ожидание заполнения таблицы, когда вы загружаете данные из URL-адреса Мой @property объявлен, но я все еще получаю, может не отвечать на предупреждение UICollectionView не правильный размер в viewDidLoad

получение 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 или в любом другом подходящем месте по мере необходимости.