Mam projekt ARC i próbuję narysować pionowy gradient liniowy. Poniższy kod działa na symulatorze, ale powoduje błąd pamięci/EXC_BAD_ACCESS
podczas testowania na urządzeniu. Aplikacja awarii na następujące dwa wiersze kodu:Problem z CFArrayRef i NSArray podczas rysowania gradientu przy użyciu ARC
NSArray *colorArray = [NSArray arrayWithObjects:(__bridge id)topColor, (__bridge id)bottomColor, nil];
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef) colorArray, colorLocations);
Te dwa wiersze kodu są pobierane z następującego kodu (w celach informacyjnych):
- (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);
}
Dzięki wyprzedzeniem dla każdego i wszystkie wskazówki.
Nie kochasz łuku? Zabieranie programistycznej kontroli pamięci ... Myślałem, że Apple nauczyło się ich lekcji z odśmiecaniem. Nie polecam go używać ... –
Polecam używanie ARC, naprawdę musi być przekonującym powodem, aby tego nie robić. – zaph
Dlaczego używasz obiektu tam, gdzie wszystko inne jest 'CFType'? Po prostu użyj 'CFArray' i nie musisz się martwić o mostkowanie. –