gpt4 book ai didi

ios - 在设备中安装应用程序时获取EXC_BAD_ACCESS,核心图形

转载 作者:行者123 更新时间:2023-12-01 18:26:46 25 4
gpt4 key购买 nike

我正在做的是绘制一个简单的矩形并为绘制区域设置颜色

   // Just added
@interface Gradient () {
CGColorRef lightBlueColor;
}
@implementation Gradient

-(id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor lightGrayColor];
NSLog(@"frame is %@",NSStringFromCGRect(self.frame));
NSLog(@"bound is %@",NSStringFromCGRect(self.bounds));
lightBlueColor = [UIColor colorWithRed:105.0f/255.0f green:179.0f/255.0f blue:216.0f/255.0f alpha:1.0].CGColor;

}
return self;
}

-(void) layoutSubviews {
paperRect = CGRectMake(10, 10, self.bounds.size.width/2, self.bounds.size.height/2);
}

-(void)drawRect:(CGRect)rect {

//Draw a retangle
CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSetFillColorWithColor(context, lightBlueColor);
CGContextFillRect(context, paperRect);


}

以下是模拟器上显示的内容

但是,当我尝试在设备上安装时,得到的是EXC_BAD_ACCESS

问题:

为什么它在设备上不起作用。我在某个地方犯错了吗

编辑:我刚刚尝试修改lightBlueColor

lightBlueColor = [UIColor blueColor] .CGColor;

然后,我可以在设备上运行该应用程序。我一点都不明白

最佳答案

编辑:,因此您刚遇到内存管理问题。从理论上讲,在两种情况下,程序都可能崩溃。为什么?因为根据文档,-[UIColor lightBlueColor]及其伴随的类方法返回一个自动释放的对象。实际上,出于优化的原因,这不是真的:实际上,它们返回相同的分配启动的单例以节省内存。这种优化是可能的,因为它们始终返回相同的颜色。由于共享实例(单一颜色)是在没有自动释放的情况下创建的,因此当您不希望这样做时,它不会突然释放,这就是程序正常运行的原因。如果苹果的程序员不够聪明,无法进行优化,那么这两个程序都会崩溃。

但是在第二种情况下,colorWithRed:green:blue:alpha:方法可能无法进行此优化,因为不能保证它总是返回相同的颜色。 (想象一下,如果先调用它来获取红色,然后对其进行缓存,然后又想要获取一种蓝色,但是它将返回所缓存的红色,将会发生什么。)因此,它实际上创建了一个新的a实例。颜色并自动释放它。但是由于您不保留它,因此由于自动释放而很快将其释放,因此它的CGColor属性也无效。因此,有三种可能的解决方案:

一。我更喜欢这个。使lightBlueColor实例变量成为UIColor对象,并使用创建它

lightBlueColor = [[UIColor alloc] initWithRed:r green:g blue:b alpha:a];

然后只需使用其 CGColor属性进行绘制即可。

二。与第一个相似,但是您可以将color对象创建为
lightBlueColor = [[UIColor colorWithRed:r green:g blue:b alpha:a] retain];

同样,但是我会说这是一个错误的概念。

第三:您可以使UIColor对象在自动释放池的深处消失,但要保持 CGColor的安全:
lightBlueColor = CGColorRetain([UIColor colorWithRed:r green:g blue:b alpha:a].CGColor);

在每种情况下,您都应该在 dealloc方法中注意内存管理。

经验教训:实例变量不适用于存储自动发布的对象。您想在适当的时候分配并初始化。

关于ios - 在设备中安装应用程序时获取EXC_BAD_ACCESS,核心图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12985593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com