2016-07-29 173 views
0

我的應用程序本質上是一個卡片集合,每個卡片上都有各種消息/信息。人們通過這些卡片,通常向右滑動。我目前得到這個SIG ABRT錯誤:SIGABRT /無法識別的選擇器

#import <UIKit/UIKit.h> 
#import "AppDelegate.h" 

int main(int argc, char * argv[]) { 
    @autoreleasepool { 
     return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 
    } 
} 

它還版畫,這一點:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[filterPageViewController askForPushNotifications]: unrecognized selector sent to instance 0x7f8b6d0acd80' 
*** First throw call stack: 
(
    0 CoreFoundation      0x000000010fa92d85 __exceptionPreprocess + 165 
    1 libobjc.A.dylib      0x000000010f506deb objc_exception_throw + 48 
    2 CoreFoundation      0x000000010fa9bd3d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205 
    3 CoreFoundation      0x000000010f9e1cfa ___forwarding___ + 970 
    4 CoreFoundation      0x000000010f9e18a8 _CF_forwarding_prep_0 + 120 
    5 Lettuce        0x000000010a2780a6 -[DraggableViewBackground cardSwipedRight:] + 2470 
    6 Lettuce        0x000000010a2d0ad5 -[DraggableView rightAction] + 453 
    7 Lettuce        0x000000010a2d02ed -[DraggableView afterSwipeAction] + 77 
    8 Lettuce        0x000000010a2cfe22 -[DraggableView beingDragged:] + 1922 
    9 UIKit        0x000000010d9c7b28 _UIGestureRecognizerSendTargetActions + 153 
    10 UIKit        0x000000010d9c419a _UIGestureRecognizerSendActions + 162 
    11 UIKit        0x000000010d9c2197 -[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:] + 843 
    12 UIKit        0x000000010d9ca655 ___UIGestureRecognizerUpdate_block_invoke898 + 79 
    13 UIKit        0x000000010d9ca4f3 _UIGestureRecognizerRemoveObjectsFromArrayAndApplyBlocks + 342 
    14 UIKit        0x000000010d9b7e75 _UIGestureRecognizerUpdate + 2634 
    15 UIKit        0x000000010d54448e -[UIWindow _sendGesturesForEvent:] + 1137 
    16 UIKit        0x000000010d5456c4 -[UIWindow sendEvent:] + 849 
    17 UIKit        0x000000010d4f0dc6 -[UIApplication sendEvent:] + 263 
    18 UIKit        0x000000010d4ca553 _UIApplicationHandleEventQueue + 6660 
    19 CoreFoundation      0x000000010f9b8301 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17 
    20 CoreFoundation      0x000000010f9ae22c __CFRunLoopDoSources0 + 556 
    21 CoreFoundation      0x000000010f9ad6e3 __CFRunLoopRun + 867 
    22 CoreFoundation      0x000000010f9ad0f8 CFRunLoopRunSpecific + 488 
    23 GraphicsServices     0x00000001107e2ad2 GSEventRunModal + 161 
    24 UIKit        0x000000010d4cff09 UIApplicationMain + 171 
    25 Lettuce        0x000000010a2c3f0f main + 111 
    26 libdyld.dylib      0x000000011012492d start + 1 
    27 ???         0x0000000000000001 0x0 + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
(lldb) 

經過一番調查,我發現有問題的代碼。這是我cardSwipedRight方法中的一條線,是我draggableviewbackground類(該類用作甲板,以容納所有的卡):

   [((settingsTableViewController *)([obj.superNavController.viewControllers[obj.profileNum] viewControllers][0])) askForPushNotifications]; 

這行代碼是檢查這是否一個if語句中是「註冊通知卡」。我感到困惑的是,爲什麼xcode與askForPushNotifications相關聯的filterPageView。 filterPageView不僅沒有askForPushNotifications方法,而且我也不會在filterPageView上滑動,也不會在應用程序崩潰時查看它。

+0

您的filterPageViewController是否有一個名爲askForPushNotifications的方法? –

+0

不是它不 – Matt

+0

發現這樣的錯誤。你在不應該的地方稱呼它。 –

回答

0

一個接收一個無法識別的選擇異常時發送的選擇,選擇器發送不執行對象/響應。簡而言之,如果一個類A沒有實現一個方法,並且有人試圖在類A的一個對象上調用該方法,那麼運行時會拋出一個無法識別的選擇器異常。

當我們不確定對象是否會響應選擇器時,我們應該進行安全檢查以查看對象是否響應了預期的選擇器。

例如,

if ([*obj* respondsToSelector:@selector(*selector*)]) 
{ 
    [*obj* performSelector:*selector*]; 
} 
+0

所以在我的askForPushNotifications方法中,我應該有這個if語句作爲安全檢查嗎? – Matt

+0

或者我應該有這個if語句之前,「[((settingsTableViewController *)([obj.superNavController.viewControllers [obj。profileNum] viewControllers] [0]))askForPushNotifications]; 「 – Matt

+0

是的,當你不確定對象是否會響應某個方法時,你應該總是** ** respondsToSelector **檢查。這樣你就可以避免這種類型的崩潰。 – Anup

0

當您嘗試調用對象上的方法但該方法不存在時,發送給實例的無法識別的選擇器出現(更正的術語是,您試圖發送名爲「askForPushNotifications」的消息,但settingsTableViewController不理解它,因爲它(askForPushNotifications)不會退出。我相信你可能沒有在你的settingsTableViewController中的方法。請檢查並讓我知道這是否對你有幫助。

此外,請檢查與respondsToSelector,如果對象實際迴應方法askForPushNotifications。可能是這種情況,

((settingsTableViewController *)([obj.superNavController.viewControllers[obj.profileNum] viewControllers][0]))

可能不是類型SettingsTableViewController。請檢查

if [(((settingsTableViewController *)([obj.superNavController.viewControllers[obj.profileNum] viewControllers][0])) respondsToSelector:@selector(askForPushNotifications)] 
{ 
    [((settingsTableViewController *)([obj.superNavController.viewControllers[obj.profileNum] viewControllers][0])) askForPushNotifications]; 
} 
+0

askForPushNotifications是在我的settingsTableViewController雖然:/ – Matt

+0

它是否在.h文件中聲明? –

+0

是的,它也在.h文件中聲明 – Matt

相關問題