我知道如何解决,我大概勾勒出的问题,但是,我有点困惑,为什么代码情景工作在iPhone模拟器却没有关于我的iPad。
我有检查各种特性,然后设置一个的背景颜色的方法CALayer
取决于属性的状态。 下面的代码类似于我的颜色分配的方法:
//This will be the CALayer BGColor...
CGColor c = UIColor.blueColor.CGColor; //Blue is the default
switch (myState)
{
case state_one:
c = UIColor.greenColor.CGColor;
//... more code ...
break;
case state_two:
c = UIColor.redColor.CGColor;
//... more code ...
break;
case state_three: //multiple cases are like the state_three case.
//Other code, but I don't need to assign the color. Blue works...
}
myCALayer.backgroundColor = c; //Oh-noes!!! Here we get the dreaded EXC_BAD_ACCESS on iPad
//...more code dealing with the layer.
上面的代码工作没有在模拟器麻烦。 然而,当我在我的iPad上运行应用程序,它崩溃的backgroundColor
分配。
我可以摆脱的解决这个问题CGColor
变量和我的开关/ case语句内分配从直接的背景色,而这正是我打算做。
不过,我很好奇。 为什么会这样工作在一个环境中,而不是其他?
UPDATE
两件事情。 首先,这是值得一提,这是一个ARC项目,使用的Xcode 4.2,针对iOS 5的设备。 另外,我的色彩assignement代码并不完全是什么样子,因为我有一个系列,我用它来设置这些颜色,因为它们涉及到了我的申请中引用的所有定义。
这是几个中#define
语句是这样的:
#define BLUE [UIColor colorWithRed:8.0/255.0 green:80.0/255.0 blue:150.0/255.0 alpha:1.0].CGColor
#define GREEN (UIColor.blueColor.CGColor)
//...and there are about 6 other colors
我试图简化我的代码,因为编译器应该更换裁判给我的裁判我的定义。 不过,值得一提的,以防万一。
这是我的预感:这有可能是UIColor
您通过之前创建它(并举行仅供参考)已被破坏CGColor
。 由于CGColorRef
的引用计数是不适合你ARC下处理,色彩将是一个叼着参考,如果UIColor
是持有它,你使用之前被摧毁CGColor
。
ARC拥有其中“自动释放”的对象可能永远不会被添加到自动释放池,而是,优化released
后objc对象不再被引用。 这是三件事情的组合:
- 编译器版本和选择使用。 毫不奇怪,编译器会将引用计数,并没有针对此变化。
- 在ObjC运行。 运行时可以利用线程本地数据。 当然,这可能包括你的筹码。 如果你读入的对象可以绕过如何自动释放池的细节,这应该是清晰的。
- 该库使用(包括系统库和框架)。 由于编译器和运行时被更新,库可以使用ARC,也可以使用不同的运行时调用执行程序。
知道了,我怀疑这节目能纠正问题:
UIColor * c = UIColor.blueColor; //Blue is the default
switch (myState) {
case state_one:
c = UIColor.greenColor;
//... more code ...
break;
case state_two:
c = UIColor.redColor;
//... more code ...
break;
case state_three: //multiple cases are like the state_three case.
//Other code, but I don't need to assign the color. Blue works...
}
myCGLayer.backgroundColor = c.CGColor;
//...more code dealing with the layer.
更具体地说,有办法的编译器和运行时objc能够解释并执行程序的数量。 这意味着,这个问题可能会影响到你,当你改变的编译器版本,或在运行时(OS)被更新。 它也可以发生,因为你使用的库更新或使用不同版本或编译器设置建。 例如:如果库切换到沿途的弧线,它可以使用不同的运行时调用,或者如果编译器注入调用更新调用可以利用不同的线程本地数据。
大约因为它涉及到运行时的ARC规范详细信息可以在这里找到: http://clang.llvm.org/docs/AutomaticReferenceCounting.html#runtime
类似的问题在这里看到:
EXC_BAD_ACCES绘制阴影
由于ARC的色彩被释放的方法结束为时尚早。
我使用:CGColorRetain
CGColorRef whiteColor = CGColorRetain([UIColor colorWithRed:1.0 green:1.0
blue:1.0 alpha:1.0].CGColor);
你不说你的实例myCGLayer
我们源自,但我会采取了一枪,并说这是不是从CGLayer衍生,因为CGLayer不具有backgroundColor
属性。 所以我猜(再一次),传递的参数应该是类型的UIColor的,而不是CGColor。 CGColor从类CFType的。 的UIColor从NSObject的派生。 他们不应该互换。 如果我的猜测是正确的,我很惊讶,它工作在模拟器。
不要打我太用力,如果我的猜测是错误的。
文章来源: Assigning an existing CGColor to a CGColor property works in iOS Simulator, not iOS device. Why?