1

我正在使用渐变自定义视图并通过执行以下操作在其上添加 uilabel:

@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);            
}

当我在模拟器中运行时,一切都按我的预期运行。但是,当我在设备上安装时,应用程序崩溃并且我得到

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

你有什么想法为什么我会遇到这个问题?

4

1 回答 1

2

试试这个:

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

或这个:

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

ARC 可能会在UIColor您不使用它们时立即释放它们,并且通过释放它们,它们的CGColor属性也会被释放,因为没有人保留它们。

于 2013-04-03T16:41:33.150 回答