2016-07-29 2 views
0

Mon application est essentiellement une collection de cartes, chacune avec divers messages/informations à ce sujet. On balaie pour passer ces cartes, en général balayant bien. Je reçois actuellement cette sig erreur ABRT:SIGABRT/Sélecteur non reconnu

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

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

Il imprime aussi, ceci:

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) 

Après quelques recherches, j'ai trouvé le code problématique. Il est une ligne dans ma méthode de cardSwipedRight qui est dans ma classe draggableviewbackground (cette fonctions de classe comme une plate-forme, de tenir toutes les cartes):

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

Cette ligne de code est dans une instruction if qui vérifie si cette est un "inscrivez-moi pour la carte de notifications". Ce que je suis confus, c'est pourquoi xcode associé filterPageView avec askForPushNotifications. Non seulement filterPageView n'a pas de méthode askForPushNotifications, mais je ne balaye pas directement sur filterPageView et je ne l'ai pas vu au moment où mon application tombe en panne.

+0

Est-ce que votre filterPageViewController a une méthode appelée askForPushNotifications? –

+0

Non, il ne le fait pas – Matt

+0

Trouvé l'erreur donc. Vous l'appelez où vous ne devriez pas. –

Répondre

0

On reçoit une exception de sélection non reconnu lorsque l'objet auquel le sélecteur est envoyé ne pas mettre en œuvre/répondre au sélecteur envoyé. En termes simples, si une classe A n'implémente pas une méthode et que quelqu'un tente d'appeler cette méthode sur un objet de classe A, runtime lève une exception de sélecteur non reconnue.

Lorsque nous ne sommes pas sûrs qu'un objet répondra à un sélecteur, nous devrions effectuer une vérification de sécurité pour voir si un objet répond au sélecteur prévu.

Par exemple.

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

donc dans ma méthode askForPushNotifications, je devrais avoir cette déclaration if comme un contrôle de sécurité? – Matt

+0

Ou devrais-je avoir cette instruction if avant, "[((settingsTableViewController *) ([obj.superNavController.viewControllers [obj.profileNum] viewControllers] [0])) askForPushNotifications]; " – Matt

+0

Oui, vous devriez toujours avoir ** respondsToSelector ** vérifier si vous n'êtes pas sûr que l'objet répondra à une méthode, de cette façon vous éviterez ce genre de crash. – Anup

0

Un sélecteur non reconnu envoyé à l'instance apparaît lorsque vous essayez d'appeler une méthode sur un objet mais cette méthode n'existe pas (La terminologie corrigée est que vous avez essayé d'envoyer un message appelé "askForPushNotifications" mais settingsTableViewController comprenez-le car il (askForPushNotifications) ne quitte pas.Je suis sûr que vous ne pouvez pas avoir cette méthode dans votre settingsTableViewController S'il vous plaît vérifier et laissez-moi savoir si cela vous a aidé.

En outre, s'il vous plaît vérifier avec respondsToSelector si l'objet effectivement répond à la méthode askForPushNotifications.Il peut être le cas que

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

peut ne pas être de type SettingsTableViewController. S'il vous plaît vérifier

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

askForPushNotifications est dans mes settingsTableViewController si:/ – Matt

+0

Est-il déclaré dans le fichier .h? –

+0

Oui, il est également déclaré dans le fichier .h – Matt