Question

I am customizing my view with gradient and adding an uilabel on it by doing the following :

@implementation ECertificateViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
    CustomViewBackGround  *bgView       =   [[CustomViewBackGround alloc] initWithFrame:CGRectMake(0, 0, 301, 26)];
    [self.mainView addSubview:bgView];
}


#import "CustomViewBackGround.h"

@implementation CustomViewBackGround
- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {
        CGFloat height                  =   20.0;
        CGFloat x                       =   5;
        CGFloat y                       =   3;
        titleLabel                      =   [[UILabel alloc] initWithFrame:CGRectMake(x, y, self.bounds.size.width - 2 * x, height)] ;
        titleLabel.text                 =   @"This is my label";
        titleLabel.textAlignment        =   NSTextAlignmentLeft;
        titleLabel.opaque               =   NO;
        titleLabel.backgroundColor      =   [UIColor clearColor];
        titleLabel.font                 =   [UIFont boldSystemFontOfSize:14];
        titleLabel.textColor            =   [UIColor lightGrayColor];
        [self addSubview:titleLabel];
    }
    return self;
}

- (void)drawRect:(CGRect)rect {
    CGContextRef context            =   UIGraphicsGetCurrentContext();

    CGColorRef whiteColor           =   [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0].CGColor;
    CGColorRef lightGrayColor       =   [UIColor colorWithRed:230.0/255.0
                                                        green:230.0/255.0
                                                         blue:230.0/255.0
                                                        alpha:1.0].CGColor;
    CGColorRef separatorColor       =   [UIColor colorWithRed:208.0/255.0 green:208.0/255.0 blue:208.0/255.0 alpha:1.0].CGColor;

    CGRect paperRect                =   self.bounds;

    // Fill with gradient
    drawLinearGradient(context, paperRect, whiteColor, lightGrayColor);

    // Add white 1 px stroke
    CGRect strokeRect           =   paperRect;
    strokeRect.size.height     -=   1;
    strokeRect                  =   rectFor1PxStroke(strokeRect);

    CGContextSetStrokeColorWithColor(context, whiteColor);
    CGContextSetLineWidth(context, 1.0);
    CGContextStrokeRect(context, strokeRect);

    // Add separator
    CGPoint startPoint          =   CGPointMake(paperRect.origin.x, paperRect.origin.y + paperRect.size.height - 1);
    CGPoint endPoint            =   CGPointMake(paperRect.origin.x + paperRect.size.width - 1, paperRect.origin.y + paperRect.size.height - 1);
    draw1PxStroke(context, startPoint, endPoint, separatorColor);            
}

When I am running in the simulator, everything is working fine as I expect. However, when I am installing on the device, the app crashes and I am getting

[Not A Type retain]: message sent to deallocated instance,objctive c

Do you have any ideas why am I getting this issue?

Was it helpful?

Solution

Try this:

UIColor *whiteColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
...
drawLinearGradient(context, paperRect.CGColor, whiteColor.CGColor, lightGrayColor.CGColor);

Or this:

CFColorRef whiteColor = CFBridgingRetain([UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0].CGColor);
...
drawLinearGradient(context, paperRect, whiteColor, lightGrayColor);
...
CFRelease(whiteColor);
...

It may be that ARC releases your UIColors as soon as you don't use them, and by releasing them, their CGColor properties get released as well since no one retained them.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top