2017-01-14 1 views
4

Kurze Beschreibung: Ich bekomme doesNotRecognizeSelector Fehler beim Aufruf der Methode auf Objekt, das definitiv diese Methode hat und es passiert nach dem Aufruf respondsToSelector.doesNotRecognizeSelector Fehler nach AntwortenToSelector überprüfen

Es ist eine sehr seltsame Situation und ich habe nicht verstanden, wie es sein kann :). Ich habe diesen Fehler bei der Anmeldung einiger Benutzergeräte gesehen, aber nicht bei allen. Ich kann das nicht auf meinem eigenen Gerät wiederholen.

Ich versuche herauszufinden, wie es passieren kann und fügte Bedingung mit respondsToSelector hinzu, aber Problem tritt wieder auf.

Einige Code unten. Hoffe es hilft

1) Ich habe viewController Objekt in AppDelegate.

2) In einer anderen Klasse versuche ich, dieses Objekt zu bekommen und eine seiner Methoden aufzurufen. Aber auf [viewController showBanner] Aufruf alle fehlschlägt mit doesNotRecognizeSelector Fehler.

- (void) onEnterTransitionDidFinish { 
    [super onEnterTransitionDidFinish]; 

    AdRootViewController *viewController = [(AppDelegate *)[[UIApplication sharedApplication] delegate] viewController]; 
    if (viewController != nil && [viewController respondsToSelector:@selector(showBanner)]) { 
     [viewController showBanner]; 
    } 
} 

3) AdRootViewController hat diese Methode und es ist in der Schnittstelle deklariert.

@interface AdRootViewController : UIViewController { 
} 
- (void)showBanner; 
... 
@end 

@implementation AdRootViewController 
... 
- (void)showBanner 
{ 
    adBannerViewIsVisible = YES; 
    ... 
} 
... 
@end 

Die fehlgeschlagene Zeichenfolge ist [viewController showBanner].

Fehlerprotokoll sieht wie folgt aus:

1 CoreFoundation __exceptionPreprocess + 1245624 
2 libobjc.A.dylib objc_exception_throw + 34136 
3 CoreFoundation -[NSObject(NSObject) doesNotRecognizeSelector:] + 1274468 
4 CoreFoundation ___forwarding___ + 1262188 
5 CoreFoundation _CF_forwarding_prep_0 + 186376 
6 <project_id> 4296487336 + 487848 
... 

P. S. Mai Stack-Trace wird es besser zeigen: enter image description here

+0

Setzen Sie einen Haltepunkt auf der Zeile, wo Sie "showBanner" und überprüfen Sie die ViewController iVar, um sicherzustellen, dass es tatsächlich eine Instanz von "AdRootViewController" ist. In AppDelegate könnte ein Problem auftreten, bei dem Sie der Eigenschaft nicht das richtige Objekt zuweisen. – YvesLeBorg

+0

hi, danke aber es ist alles schon überprüft. Das Problem ist in meiner eigenen Umgebung nicht reproduzierbar. Ich habe zusätzliche Überprüfungen für nil und 'answerToSelector:' usw. hinzugefügt, aber das Problem existiert immer noch auf einigen Geräten des Benutzers. Ich habe nur überrascht, dass nach 'AntwortenToSelector:' ausgelöst werden kann "doesNotRecognizeSelector" Ausnahme in einer solchen Situation. – comrade

+0

@comrade Ich bin mir absolut sicher, dass das nicht passieren kann. Ich frage mich, ob '[super onEnterTransitionDidFinish]' nicht der Schuldige sein kann. Wenn Sie das Problem nicht reproduzieren können, sollten Sie überprüfen, ob der Benutzer die aktuelle Version Ihrer App verwendet. – Sulthan

Antwort

1

ich einen gibt es sehr seltene Situation dieser Situation passieren kann, in denen realisiert werden können.

Auf Geräten mit Jailbreak gibt es viele Tools, die dies verursachen können. Z.B. Ein Tool zum Anzeigen von Inhalten, die hinter In-App-Käufen verborgen sind, oder ein Tool zum Ausblenden von Anzeigen.

Diese Tools zielen in der Regel auf offene Bibliotheken für In-App-Käufe oder Anzeigen ab.Wenn Sie eine solche Bibliothek verwenden, ersetzt das Tool einfach die Implementierung Ihrer Klasse durch eine eigene Implementierung, die Ihre Funktionalität außer Kraft setzt - verhalten Sie sich wie alles bereits bezahlt oder entfernen Sie die Methoden zum Anzeigen von Anzeigen (siehe z. B. http://www.tenorshare.com/guide/how-to-block-ads-on-iphone-ipad-ipod.html) Ich habe mindestens zwei offene Bibliotheken gefunden, die Klasse AdRootViewController verwenden. Das bedeutet, dass ein solches Tool versuchen wird, die Implementierung Ihrer Klasse zu ersetzen und dabei auch die Methode showBanner zu entfernen.

Sie können nur überprüfen, ob diese Absturzberichte von Jailbroken-Geräten stammen (wenn Sie keine Crashlytics oder ähnliche Crash-Reporting-Bibliotheken verwenden, verwenden Sie sie).

Wenn Sie wissen, dass der Fehler nur auf Jailbroken-Geräten vorhanden ist, ignorieren Sie sie. Es wird vom Nutzer verursacht, wenn er versucht, Ihre Anzeigen zu entfernen.

+0

Hmm, es macht wirklich Sinn. Danke, ich überprüfe das. – comrade

0

ganzen Code sieht perfekt aus. so Fehler kann nicht lesbar sein, und das ist seltsam, dass Sie diese respondsToSelector:@selector(showBanner) überprüfen, weil in diesem Code nicht überprüft werden muss, dass ein View-Controller in der Lage ist, diese Methode zu reagieren, weil es eine Objektmethode ist und es aufrufen muss View-Controller nicht nil, so muss nur überprüfen, dass ein ViewController ist nicht

so in Ihrem Code habe ich etwas gefunden, dass dieser Fehler verursacht werden kann ich weiß nicht, wie es aber sein kann, weil dies nicht gemeinsame Sache folgen so können Sie versuchen dies für mich, dass es funktioniert oder nicht

in Ihrem Code appDelegate ist ein NSObject-Typ, aber im Allgemeinen ist dies UIResponder Typ, so dass ich nur ersetzen NSObject zu UIResponder

@interface AppDelegate : UIResponder <UIApplicationDelegate> { 
} 

Bitte versuchen Sie diese hoffen, dass diese Sie

Verwandte Themen