使用委托时SIGSEGV崩溃

时间:2014-02-04 07:40:26

标签: ios objective-c sigsegv

我一直收到这个崩溃报告,我无法弄清楚问题出在哪里。我知道SIGSEGV异常类型通常是由于内存管理问题。

崩溃日志,

zException Type:  SIGSEGV
Exception Codes: SEGV_ACCERR at 0x10
Crashed Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib                     0x394db0fc objc_retain + 12
1   Sparkle                             0x0012c9d7 -[PhotoAssetView didSelectButton:] (PhotoAssetView.m:44)
2   UIKit                               0x3193ada3 -[UIApplication sendAction:to:from:forEvent:] + 91
3   UIKit                               0x3193ad3f -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 39
4   UIKit                               0x3193ad13 -[UIControl sendAction:to:forEvent:] + 47
5   UIKit                               0x31926743 -[UIControl _sendActionsForEvents:withEvent:] + 375
6   UIKit                               0x3193a75b -[UIControl touchesEnded:withEvent:] + 595
7   UIKit                               0x318fe1a1 _UIGestureRecognizerUpdate + 5529
8   UIKit                               0x319359fd -[UIWindow _sendGesturesForEvent:] + 773
9   UIKit                               0x319353ab -[UIWindow sendEvent:] + 667
10  UIKit                               0x3190ad79 -[UIApplication sendEvent:] + 197
11  UIKit                               0x31909569 _UIApplicationHandleEventQueue + 7117
12  CoreFoundation                      0x2f14cf1f __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
13  CoreFoundation                      0x2f14c3e7 __CFRunLoopDoSources0 + 207
14  CoreFoundation                      0x2f14abd7 __CFRunLoopRun + 631
15  CoreFoundation                      0x2f0b5471 CFRunLoopRunSpecific + 525
16  CoreFoundation                      0x2f0b5253 CFRunLoopRunInMode + 107
17  GraphicsServices                    0x33def2eb GSEventRunModal + 139
18  UIKit                               0x3196a845 UIApplicationMain + 1137
19  Sparkle                             0x0040a427 main (main.m:18)

在此方法[PhotoAssetView didSelectButton:]中,我们使用unsafe_unretained delegate

调用了一个方法
[self.delegate didSelectButtonForPhotoAsset:sender];

任何指针?

2 个答案:

答案 0 :(得分:3)

你是否在其他地方强烈提及代表?通常设置一个对象的委托不会创建一个强引用,所以如果你不自己保留它,它将在被调用之前被释放,你会像这样崩溃。

答案 1 :(得分:1)

对委托对象的引用必须是弱类型: unsafe_unretained _weak

如果PhotoAssetView委托(可能是ViewController) unsafe_unretained ,那么当引用的对象被释放时,引用不再有效。在这个地址可以是其他对象或垃圾,并向地址发送消息导致异常。

修复:

  1. 使用 _weak 引用代替 unsafe_unretained 。如果 引用声明为 _weak ,它自动设置为nil 当对象被释放时(所以准备好它可能会变为零) 随机时刻)。
  2. 如果您出于某种原因仍想使用 unsafe_unretained 引用,则必须在PhotoAssetView委托对象的dealloc中手动将引用设置为nil:
  3. // SomeViewController.m

    - (void) dealloc{
      self.photoAssetView.delegate = nil;
    }