получение 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); }
Ниже показано, что отображается на симуляторе
- Crosshatch в IOS с использованием CoreGraphics?
- drawInRect прозрачное изображение PNG: Цель C
- Невозможно рисовать прямоугольники над изображением в пользовательском UIView
- iOS - Core Graphics работает с цветами, но не с черным, белым, серым
- Как добавить альфа-слой над частью UIImage в drawRect?
Однако, когда я пытаюсь установить на устройство, я получаю EXC_BAD_ACCESS
Вопрос:
почему он не работает на устройстве. Я сделал ошибку где-то
Изменить: я только что попробовал изменить lightBlueColor
lightBlueColor = [UIColor blueColor] .CGColor;
Затем я могу запустить приложение на устройстве. Я вообще не понимаю
- аргумент aRect от drawRect относительно границ UIView
- Core Graphics-drawRect: недостаточно часто вызываться
- Чертеж UIBezierPath занимает 100% CPU
- Пользовательский UIView в UIScrollView drawRect никогда не вызывал
- CAEmitterLayer не отображается
- Если я часто вызываю setneedsdisplay, как часто будет вызываться drawrect? почему это?
- UIGraphicsGetCurrentContext () короткое время жизни
- drawRect на iPad вызывает проблемы с памятью
Изменить: так что вы просто столкнулись с проблемой управления памятью. Теоретически, в обоих случаях программа могла быть разбита. Зачем? Поскольку в соответствии с документацией, -[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
или в любом другом подходящем месте по мере необходимости.