UITableView addsubview 崩溃

Posted

技术标签:

【中文标题】UITableView addsubview 崩溃【英文标题】:UITableView addsubview crahes 【发布时间】:2012-10-21 16:13:38 【问题描述】:

我想将包含 CABasicAnimation 的自定义 UIView 添加到 UITableViewCell。我这样做是通过以下方式

if( self.pie_chart_view == nil )
    self.pie_chart_view = [[PieChartView alloc] initWithFrame:CGRectMake( 0.f, 0.f, 30.f, 30.f )];
[pie_chart_view animate_progress_from:0.0 to:1.0 with_duration:5.0];
[cell.contentView addSubview:pie_chart_view];

但代码崩溃,如下图所示:

崩溃显然是由以下代码引起的

- (void)drawInContext:(CGContextRef)context 
CGRect circleRect = CGRectInset(self.bounds, 1, 1);

CGColorRef borderColor = [[UIColor whiteColor] CGColor];
CGColorRef backgroundColor = [[UIColor colorWithWhite:0 alpha: 0.75] CGColor];

CGContextSetFillColorWithColor(context, backgroundColor); <--- CRASHES ON THIS LINE WITH EXC_BAD_ACCESS
CGContextSetStrokeColorWithColor(context, borderColor);
CGContextSetLineWidth(context, 2.0f);

CGContextFillEllipseInRect(context, circleRect);
CGContextStrokeEllipseInRect(context, circleRect);

CGFloat radius = MIN(CGRectGetMidX(circleRect), CGRectGetMidY(circleRect));
CGPoint center = CGPointMake(radius, CGRectGetMidY(circleRect));
CGFloat startAngle = -M_PI / 2;
CGFloat endAngle = self.progress * 2 * M_PI + startAngle;
CGContextSetFillColorWithColor(context, borderColor);
CGContextMoveToPoint(context, center.x, center.y);
CGContextAddArc(context, center.x, center.y, radius, startAngle, endAngle, 0);
CGContextClosePath(context);
CGContextFillPath(context);

[super drawInContext:context];

但我不明白它为什么会崩溃。我的项目使用 ARC。我在这里错过了什么?

【问题讨论】:

【参考方案1】:

好的,我解决了这个问题。使用 ARC 时,UIColor 会立即被删除。可以通过执行以下操作来修复此问题:

UIColor * __autoreleasing borderColor = [UIColor whiteColor];
UIColor * __autoreleasing backgroundColor = [UIColor colorWithWhite:0 alpha: 0.75];

CGContextSetFillColorWithColor(context, backgroundColor.CGColor );
CGContextSetStrokeColorWithColor(context, borderColor.CGColor );

之后代码不再崩溃。

【讨论】:

以上是关于UITableView addsubview 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

发生 IBAction 时,Swift addsubview 和应用程序崩溃

addSubview 崩溃 iOS 5.1 但不是 6.1

仅某些单元格中的addSubView

转换后 addSubview 不起作用

使用 addSubview 动态添加 UITextField 的 UITableViewCell - 如何在键盘上“返回”时获取 UITextField 值

如何在 StackView 中展开 UITableView?