EXC_BAD_ACCESS与ARC

我正在使用ARC,我有一个CustomTableViewController,并将自定义视图添加到我的背景单元格,页眉和页脚。

例如在tableView:viewForFooterInSection方法我把这些代码行:

 - (UIView *) tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section { CustomFooter *footer = [[CustomFooter alloc] init]; return footer; } 

CustomFooter是UIView的子类,它绘制一个矩形作为背景单元格- (void)drawRect:(CGRect)rect

当我在模拟器上运行应用程序的作品,但当我尝试在我的iPhone上,它崩溃。

我该如何解决它?

这是我的崩溃报告:

 Date/Time: 2012-06-28 12:37:07.168 +0200 OS Version: iPhone OS 5.1.1 (9B206) Report Version: 104 Exception Type: EXC_BAD_ACCESS (SIGSEGV) Exception Codes: KERN_INVALID_ADDRESS at 0x00000009 Crashed Thread: 0 Thread 0 name: Dispatch queue: com.apple.main-thread Thread 0 Crashed: 0 libobjc.A.dylib 0x3508cf78 objc_msgSend + 16 1 CoreFoundation 0x372d5e90 CFRetain + 76 2 CoreFoundation 0x372dfb74 +[__NSArrayI __new::] + 48 3 CoreFoundation 0x372dfa8e -[__NSPlaceholderArray initWithObjects:count:] + 294 4 CoreFoundation 0x3730ce68 +[NSArray arrayWithObjects:] + 460 5 CustomTable 0x0004766e drawLinearGradient (Common.m:15) 6 CustomTable 0x00048c14 -[CustomFooter drawRect:] (CustomFooter.m:50) 7 UIKit 0x3107015e -[UIView(CALayerDelegate) drawLayer:inContext:] + 270 8 QuartzCore 0x374b74de -[CALayer drawInContext:] + 110 9 QuartzCore 0x374b6b38 CABackingStoreUpdate_ + 1776 10 QuartzCore 0x374b632e CA::Layer::display_() + 950 11 QuartzCore 0x374b5f5a CA::Layer::display() + 122 12 QuartzCore 0x374b5e9c CA::Layer::display_if_needed(CA::Transaction*) + 168 13 QuartzCore 0x374b5844 CA::Context::commit_transaction(CA::Transaction*) + 228 14 QuartzCore 0x374b5578 CA::Transaction::commit() + 308 15 QuartzCore 0x374dd90a CA::Transaction::flush() + 38 16 QuartzCore 0x374dd8dc +[CATransaction flush] + 28 17 UIKit 0x310a6108 -[UIApplication _reportAppLaunchFinished] + 36 18 UIKit 0x31093b2c -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 1256 19 UIKit 0x31061abc -[UIApplication handleEvent:withNewEvent:] + 1004 20 UIKit 0x31061560 -[UIApplication sendEvent:] + 48 21 UIKit 0x31060f34 _UIApplicationHandleEvent + 5820 22 GraphicsServices 0x33aa3224 PurpleEventCallback + 876 23 CoreFoundation 0x3736151c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 32 24 CoreFoundation 0x373614be __CFRunLoopDoSource1 + 134 25 CoreFoundation 0x3736030c __CFRunLoopRun + 1364 26 CoreFoundation 0x372e349e CFRunLoopRunSpecific + 294 27 CoreFoundation 0x372e3366 CFRunLoopRunInMode + 98 28 UIKit 0x31092864 -[UIApplication _run] + 544 29 UIKit 0x3108fcce UIApplicationMain + 1074 30 CustomTable 0x00046798 main (main.m:16) 31 CustomTable 0x0004673c start + 32 Thread 1 name: Dispatch queue: com.apple.libdispatch-manager Thread 1: 0 libsystem_kernel.dylib 0x315343a8 kevent + 24 1 libdispatch.dylib 0x304b9ea4 _dispatch_mgr_invoke + 708 2 libdispatch.dylib 0x304b9bc2 _dispatch_mgr_thread + 30 Thread 2: 0 libsystem_kernel.dylib 0x31544cd4 __workq_kernreturn + 8 1 libsystem_c.dylib 0x33bfcf36 _pthread_wqthread + 610 2 libsystem_c.dylib 0x33bfccc8 start_wqthread + 0 Thread 3: 0 libsystem_kernel.dylib 0x31544cd4 __workq_kernreturn + 8 1 libsystem_c.dylib 0x33bfcf36 _pthread_wqthread + 610 2 libsystem_c.dylib 0x33bfccc8 start_wqthread + 0 Thread 4 name: WebThread Thread 4: 0 libsystem_kernel.dylib 0x31534004 mach_msg_trap + 20 1 libsystem_kernel.dylib 0x315341fa mach_msg + 50 2 CoreFoundation 0x373613ec __CFRunLoopServiceMachPort + 120 3 CoreFoundation 0x37360124 __CFRunLoopRun + 876 4 CoreFoundation 0x372e349e CFRunLoopRunSpecific + 294 5 CoreFoundation 0x372e3366 CFRunLoopRunInMode + 98 6 WebCore 0x32c8cc9c _ZL12RunWebThreadPv + 396 7 libsystem_c.dylib 0x33c0272e _pthread_start + 314 8 libsystem_c.dylib 0x33c025e8 thread_start + 0 Thread 0 crashed with ARM Thread State: r0: 0x00125860 r1: 0x30d16b7c r2: 0x3f9a3570 r3: 0x0014b170 r4: 0x00000001 r5: 0x2fe41188 r6: 0x0014b178 r7: 0x2fe4114c r8: 0x0014b170 r9: 0x0c345adf r10: 0x00000002 r11: 0x00000001 ip: 0x3f97f814 sp: 0x2fe41140 lr: 0x372d5e97 pc: 0x3508cf78 cpsr: 0x00000030 

这是我在CustomFooter中的drawRect函数:

 - (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 darkGrayColor = [UIColor colorWithRed:187.0/255.0 green:187.0/255.0 blue:187.0/255.0 alpha:1.0].CGColor; CGColorRef shadowColor = [UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:0.5].CGColor; CGFloat paperMargin = 9.0; CGRect paperRect = CGRectMake(self.bounds.origin.x+paperMargin, self.bounds.origin.y, self.bounds.size.width-paperMargin*2, self.bounds.size.height); CGRect arcRect = paperRect; arcRect.size.height = 8; CGContextSaveGState(context); CGMutablePathRef arcPath = createArcPathFromBottomOfRect(arcRect, 4.0); CGContextAddPath(context, arcPath); CGContextClip(context); drawLinearGradient(context, paperRect, lightGrayColor, darkGrayColor); CGContextRestoreGState(context); CGContextSaveGState(context); CGPoint pointA = CGPointMake(arcRect.origin.x, arcRect.origin.y + arcRect.size.height - 1); CGPoint pointB = CGPointMake(arcRect.origin.x, arcRect.origin.y); CGPoint pointC = CGPointMake(arcRect.origin.x + arcRect.size.width - 1, arcRect.origin.y); CGPoint pointD = CGPointMake(arcRect.origin.x + arcRect.size.width - 1, arcRect.origin.y + arcRect.size.height - 1); draw1PxStroke(context, pointA, pointB, whiteColor); draw1PxStroke(context, pointC, pointD, whiteColor); CGContextRestoreGState(context); CGContextAddRect(context, paperRect); CGContextAddPath(context, arcPath); CGContextEOClip(context); CGContextAddPath(context, arcPath); CGContextSetShadowWithColor(context, CGSizeMake(0, 2), 3.0, shadowColor); CGContextFillPath(context); CFRelease(arcPath); } 

drawLinearGradient

 void drawLinearGradient(CGContextRef context, CGRect rect, CGColorRef startColor, CGColorRef endColor) { CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGFloat locations[] = { 0.0, 1.0 }; NSArray *colors = [NSArray arrayWithObjects:(__bridge id)startColor, (__bridge id)endColor, nil]; CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef) colors, locations); CGPoint startPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect)); CGPoint endPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect)); CGContextSaveGState(context); CGContextAddRect(context, rect); CGContextClip(context); CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0); CGContextRestoreGState(context); CGGradientRelease(gradient); CGColorSpaceRelease(colorSpace); } 

JeremyP对数组初始化器崩溃的分析是正确的。 我猜测的根本原因是:

CGColorRef whiteColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0].CGColor;

我的猜测是,既然你不使用UIColor你创build超出这个声明,它将急切地发布的ARC。 这也意味着你没有以任何方式保留的CGColor (以及ARC不会保留给你的)也可能被释放和处理。

尝试每个UIColors(和白色的,只是使用[UIColor whiteColor] )这样的[UIColor whiteColor]

 UIColor *color = [UIColor ...]; CGColorRef cgColor = CFRetain(color.CGColor); color = nil; 

这里没有足够的上下文来诊断问题,但是我目前的猜测是,你的函数drawLinearRect()使用arrayWithObjects:创build一个NSArray arrayWithObjects:并且参数列表中的一个对象是垃圾。 确保列表没有终止,并且其中的所有对象都是合理的。