Tengo un proyecto ARC y estoy tratando de dibujar un degradado lineal vertical. El siguiente código funciona en el simulador, pero arroja un error de memoria/EXC_BAD_ACCESS
cuando se prueba en el dispositivo. La aplicación se bloquea en las siguientes dos líneas de código:Problema con CFArrayRef y NSArray al dibujar degradado usando ARC
NSArray *colorArray = [NSArray arrayWithObjects:(__bridge id)topColor, (__bridge id)bottomColor, nil];
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef) colorArray, colorLocations);
Esas dos líneas de código se toman de la siguiente código (con la condición de referencia):
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
[self createGradientForContext:context andView:self.captionView];
[self createGradientForContext:context andView:self.linksView];
[self createGradientForContext:context andView:self.commentView];
}
- (void)createGradientForContext:(CGContextRef)context andView:(UIView *)view
{
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGFloat colorLocations[] = { 0.0f, 1.0f };
CGColorRef topColor = [[UIColor colorWithRed:51.0f/255.0f green:51.0f/255.0f blue:51.0f/255.0f alpha:1.0f] CGColor];
CGColorRef bottomColor = [[UIColor colorWithRed:48.0f/255.0f green:48.0f/255.0f blue:48.0f/255.0f alpha:1.0f] CGColor];
NSArray *colorArray = [NSArray arrayWithObjects:(__bridge id)topColor, (__bridge id)bottomColor, nil];
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge_retained CFArrayRef) colorArray, colorLocations);
CGRect frame = view.frame;
CGPoint startPoint = CGPointMake(CGRectGetMidX(frame), CGRectGetMinY(frame));
CGPoint endPoint = CGPointMake(CGRectGetMidX(frame), CGRectGetMaxY(frame));
CGContextSaveGState(context);
CGContextAddRect(context, frame);
CGContextClip(context);
CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0);
CGContextRestoreGState(context);
CGGradientRelease(gradient);
CGColorSpaceRelease(colorSpace);
}
Gracias de antemano por cualquier y toda orientación.
¿No te gusta el arco? Quitando el control del programador de la memoria ... pensé que Apple aprendió su lección con la recolección de basura. Yo recomendaría no usarlo ... –
Recomendaría usar ARC, realmente tiene que haber una razón convincente para no hacerlo. – zaph
¿Por qué está usando un objeto allí cuando todo lo demás es un 'CFType'? Simplemente use 'CFArray' y no tiene que preocuparse por la creación de puentes. –