Frage

Wir haben also eine universelle App und erhalten eine seltsame Fehlermeldung, bei der es den Anschein hat, als würden zufällige iOS-Frameworks versuchen, unsere Methoden zu laden.Hier sind einige der Abstürze und der Code, der sie aufruft.Wie ich schon sagte, es scheint alles zufällig zu sein.Es passiert an zufälligen Orten in der App und zu zufälligen Zeiten sowie auf dem iPhone und iPad.

[__NSCFDictionary bannerViewDidLoadAd:]:Unbekannter Selektor an Instanz 0x1f3f30 gesendet

[__NSArrayM bannerViewDidLoadAd:]:Unbekannter Selektor wurde an Instanz 0x195ea0 gesendet

[UILabel bannerView:didFailToReceiveAdWithError:]:Unbekannter Selektor wurde an Instanz 0x19f950 gesendet

[ADSession bannerViewDidLoadAd:]:Unbekannter Selektor an Instanz 0x106e20 gesendet

[__NSArrayM bannerView:didFailToReceiveAdWithError:]:Unbekannter Selektor wurde an Instanz 0x521b670 gesendet

Und hier ist der Code, auf den sich diese beziehen.Warum auch immer...

- (void)bannerViewDidLoadAd:(ADBannerView *)banner {
    if (!_adBannerViewIsVisible) {                
        _adBannerViewIsVisible = YES;
        [self fixupAdView:[UIDevice currentDevice].orientation];
        NSLog(@"iAD Loaded");
    }
}

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error {

    NSLog(@"%@",error);

    if (_adBannerViewIsVisible)
    {        
        _adBannerViewIsVisible = NO;
        [self fixupAdView:[UIDevice currentDevice].orientation];
        NSLog(@"iAD Unloaded");

    }
}

BEARBEITEN:Ich denke, wir haben es auf diese eingegrenzt.Erkennt ihr hier irgendwelche eklatanten Probleme?

- (void)createAdBannerView {
    Class classAdBannerView = NSClassFromString(@"ADBannerView");
    if (classAdBannerView != nil) {
        [classAdBannerView release];
        [self.adBannerView release];
        self.adBannerView = [[classAdBannerView alloc] initWithFrame:CGRectZero];
        [_adBannerView setRequiredContentSizeIdentifiers:[NSSet setWithObjects: ADBannerContentSizeIdentifierPortrait, ADBannerContentSizeIdentifierLandscape, nil]];
        if (UIInterfaceOrientationIsLandscape([UIDevice currentDevice].orientation)) {
            [_adBannerView setCurrentContentSizeIdentifier:ADBannerContentSizeIdentifierLandscape];
        } else {
            [_adBannerView setCurrentContentSizeIdentifier:ADBannerContentSizeIdentifierPortrait];            
        }
        [_adBannerView setFrame:CGRectOffset([_adBannerView frame], 0, -[self getBannerHeight])];
        [_adBannerView setDelegate:self];

        [self.view addSubview:_adBannerView];        
    }
}

- (void)fixupAdView:(UIInterfaceOrientation)toInterfaceOrientation {
    if (![[NSUserDefaults standardUserDefaults] boolForKey:@"isadFreeUpgradePurchased"]) {
        if (_adBannerView != nil) {        
            if (UIInterfaceOrientationIsLandscape(toInterfaceOrientation)) {
                [_adBannerView setCurrentContentSizeIdentifier:ADBannerContentSizeIdentifierLandscape];
            } else {
                [_adBannerView setCurrentContentSizeIdentifier:ADBannerContentSizeIdentifierPortrait];
            }          
            [UIView beginAnimations:@"fixupViews" context:nil];
            if (_adBannerViewIsVisible) {
                CGRect adBannerViewFrame = [_adBannerView frame];
                adBannerViewFrame.origin.x = 0;
                adBannerViewFrame.origin.y = 0;
                [_adBannerView setFrame:adBannerViewFrame];
                CGRect contentViewFrame = _contentView.frame;
                contentViewFrame.origin.y = [self getBannerHeight:toInterfaceOrientation];
                contentViewFrame.size.height = self.view.frame.size.height - [self getBannerHeight:toInterfaceOrientation];
                _contentView.frame = contentViewFrame;
            } else {
                CGRect adBannerViewFrame = [_adBannerView frame];
                adBannerViewFrame.origin.x = 0;
                adBannerViewFrame.origin.y = -[self getBannerHeight:toInterfaceOrientation];
                [_adBannerView setFrame:adBannerViewFrame];
                CGRect contentViewFrame = _contentView.frame;
                contentViewFrame.origin.y = 0;
                contentViewFrame.size.height = self.view.frame.size.height;
                _contentView.frame = contentViewFrame;            
            }
            [UIView commitAnimations];
        }
    }
}
War es hilfreich?

Lösung

Es scheint, als würden zufällige iOS-Frameworks versuchen, unsere Methoden zu laden

Sie haben das umgekehrt, Sie senden diese Nachrichten an zufällige Framework-Objekte.Dies ist fast immer ein Zeichen dafür, dass Sie einen Zeiger auf ein freigegebenes Objekt haben und Ihre Versuche, Nachrichten an dieses Objekt zu senden, stattdessen an ein neues Objekt an derselben Speicheradresse gesendet werden.

Sie müssen nach Benutzern der Klasse suchen, die diese Methoden enthält, und feststellen, wo Sie versuchen, auf eine freigegebene Instanz zuzugreifen.

Andere Tipps

Sie erhalten die Meldung „Unbekannter Selektor an Instanz gesendet“, wenn Sie versuchen, eine Nachricht an ein Objekt zu senden, das nicht über diese Methode verfügt.

Beispielsweise verfügt NSDictionary nicht über die Methode „bannerViewDidLoadAd“, ADBannerView jedoch vermutlich.Sie übergeben also einfach das falsche Objekt.Setzen Sie einfach einen Haltepunkt in die Fehlerzeile und sehen Sie, woher das Objekt kommt.

(nur eine Vermutung:vielleicht iterieren Sie ein Wörterbuch/Array?, weil Wörterbücher und Arrays alles enthalten können)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top