2014-02-04 3 views
1

Я продолжаю получать этот отчет о сбоях, и я не могу понять, где проблема. Я понимаю, что тип исключения 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]; 

Есть указатели?

+1

объявлен как слабый тип – codercat

ответ

1

Ссылка на объект делегирования должен быть слабого типа: unsafe_unretained или _weak.

Если делегат PhotoAssetView (возможно, это ViewController), это unsafe_unretained, тогда при удалении объекта ссылки ссылка перестает быть действительной. По этому адресу может быть другой объект или мусор, и отправка сообщения на адрес приводит к исключению.

Чтобы исправить:

  1. Использование _weak ссылки вместо unsafe_unretained. Если ссылка заявлена ​​как _weak, она автоматически устанавливается на nil , когда объект освобожден (так что будьте готовы, чтобы он стал равным нулю при случайных моментах).
  2. Если вы по какой-то причине вы все еще хотите использовать unsafe_unretained ссылку, которую необходимо вручную установить ссылку на ноль в dealloc вашего PhotoAssetView делегата объекта:

//SomeViewController.m

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

Спасибо! ... Изменено на слабую ссылку ... – Chid

3

У вас есть сильная ссылка на делегата в другом месте? Обычно установка делегата объекта не создает сильной ссылки, поэтому, если вы не сохраните ее самостоятельно, она будет освобождена до того, как ее когда-нибудь вызовут, и вы столкнетесь вот так.

+0

У нас нет сильной ссылки для этого делегата. мы не можем воспроизвести этот крах. Получил журнал сбоев от клиента. – Chid

Смежные вопросы