Ios [非类型保留]:发送到解除分配实例的消息,目标c

Ios [非类型保留]:发送到解除分配实例的消息,目标c,ios,objective-c,nszombie,retain-cycle,Ios,Objective C,Nszombie,Retain Cycle,我正在使用渐变自定义视图,并通过执行以下操作在其上添加uilabel: @implementation ECertificateViewController - (void)viewDidLoad { [super viewDidLoad]; CustomViewBackGround *bgView = [[CustomViewBackGround alloc] initWithFrame:CGRectMake(0, 0, 301, 26)]; [sel

我正在使用渐变自定义视图,并通过执行以下操作在其上添加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
你知道我为什么会遇到这个问题吗?

试试这个:

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
s时立即释放它们,并且通过释放它们,它们的
CGColor
属性也会被释放,因为没有人保留它们

我试了第一个,它对我有效。谢谢你的帮助。