核心图形仅在真实设备上引发EXC_BAD_ACCESS

时间:2012-12-31 03:05:42

标签: iphone objective-c ios uitableview exc-bad-access

晚上好,

我刚刚完成了我制作的这个新应用程序,并且在我将它提交到应用程序商店之前我正在对它进行一些最终测试,但是出现了一些让我感到困惑的事情。对于我的一个视图控制器,我使用的是UITableView,因此我实现了

 -(UIView*) tableView:(UITableView*) tableView viewForHeaderInSection:(NSInteger) section

UITableViewDelegate协议的方法,以便我可以为标题提供自己的自定义视图。 (是的,我也符合UITableViewDataSource协议,并提供了所有必要的方法)

所以我编写了自己的UIView类并实现了drawRect:方法来绘制我自己的自定义视图。当我在iPad 6.0和iPhone 6.0模拟器中运行它时,它运行得非常好。

但是,当我插入自己的iOS设备(运行iOS 6)时,它会崩溃并抛出EXC_BAD_ACCESS。

我做了一些断点,发现在我的真实设备上运行应用程序时,代码只会执行到此处:

    // This code is the beginning of my drawRect method for my custom view
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGColorRef lightBlue = [UIColor colorWithRed:72.0/255.0
                                      green:121.0/255.0      
                                      blue:201.0/255.0 alpha:1].CGColor;

    CGColorRef cream = [UIColor colorWithRed:235.0/255.0 
                            green:235.0/255.0
                            blue:235.0/255.0 alpha:1].CGColor;
    CGContextSetFillColorWithColor(context,cream);
    CGContextFillRect(context, _paperBox); 
     // the _paperBox variable was defined earlier as CGRect _paperBox
     // the _paperBox variable was given a value in the -(void)layoutSubviews method

    CGColorRef shadow = [UIColor colorWithWhite:.5 alpha:.5].CGColor;
    CGContextSetShadowWithColor(context, CGSizeMake(0,3), 2, shadow);
    CGContextSetFillColorWithColor(context, lightBlue);

    // and later on I setup some code to draw a linear gradient:

    NSArray colors = [NSArray arrayWithObjects:(__bridge id) lightBlue,
                                                 (__bridge id) cream,
                                                 nil];

EXC_BAD_ACCESS恰好发生在最后一行。为什么这只发生在真正的iOS设备而不是模拟器上?

谢谢,

1 个答案:

答案 0 :(得分:1)

我找到了我的问题的答案,希望其他读过这个有同样麻烦的人会觉得这个回复很有帮助。由于ARC和新的__bridge修饰符的发布,我的旧版本演员:

    (__bridge id) 
每个CGColorRef上的

在新的ARC术语上在技术上并不“正确”,我对新的__bridge概念并不太熟悉所以我所做的修复它并不是为每个UIColor制作一个CGColorRef,而是将每个UIColor的CGColor属性转换为数组中的id,如下所示:

    NSArray* array = [NSArray arrayWithObjects:
    (id)[UIColor whiteColor]CGColor],
    (id)[[UIColor colorWithRed:235.0/255.0 
    green:235.0/255.0 blue:235.0/255.0]CGColor],nil];

这似乎对我有用。但是,我建议所有不熟悉新__bridge修饰符的人在使用ARC(包括我自己)时学习它们。

谢谢大家!