GADInterstitialAd 导致内存问题

ADInterstitialAd causing memory issues

我一直在使用 Sprite Kit 开发 iPhone / iPad 游戏,并且在每一轮之间我加载插页式广告。

插页式广告加载到主 GameViewController 上并位于 skview 之上。我使用一系列观察器来触发和取消广告,这一切似乎都运行良好。

但是,我注意到一些严重的内存问题,在 4 或 5 轮之后应用程序将崩溃。它似乎与 iAd 插页式广告直接相关。我附上了我的代码,您可以看到我正在释放对象,但内存占用似乎没有下降。我也在用ARC

有谁知道可能导致此问题的原因是什么?我确实在这里读到:iAd & AdMob Heavy on Memory webkit 视图似乎保留了它的内容。我需要找到解决这个问题的方法,我的 GameViewController 代码如下:

#pragma mark - GAME LOAD
-(void)loadStartScreen{
    _theView = (SKView *) self.view;
    _theView.showsFPS = YES;
    _theView.showsNodeCount = YES;
    //Sprite Kit applies additional optimizations to improve rendering performance
    _theView.ignoresSiblingOrder = YES;

    // Create and configure the scene.
    _theScene = [MainMenuScene sceneWithSize:_theView.bounds.size];
    _theScene.scaleMode = SKSceneScaleModeAspectFill;
    _theScene.backgroundColor = [UIColor grayColor];

    // Present the scene
    [_theView presentScene:_theScene];

    // setup observer
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(requestFullScreenAd) name:@"requestAdvert" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showFullScreenAd) name:@"showAdvert" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(cancelAdverts) name:@"cancelAdvert" object:nil];
}

#pragma mark - ADVERT CREATION AND SUPPORT
-(void)requestFullScreenAd {
    // run the process on the main thread in a background queue
    dispatch_async(bGQueue, ^{
        if (_requestingAd == NO) {
            _interstitial = [[ADInterstitialAd alloc]init];
            _interstitial.delegate = self;
            self.interstitialPresentationPolicy = ADInterstitialPresentationPolicyManual;
            NSLog(@"Ad Request");
            _requestingAd = YES;
        }
    });
}

-(void)showFullScreenAd{
    if (_adLoaded) {
        CGRect interstitialFrame = self.view.bounds;
        interstitialFrame.origin = CGPointMake(0, 0);
        _adView = [[UIView alloc] initWithFrame:interstitialFrame];
        [self.view addSubview:_adView];

        [_interstitial presentInView:_adView];

        _button = [UIButton buttonWithType:UIButtonTypeCustom];
        [_button addTarget:self action:@selector(closeAd:) forControlEvents:UIControlEventTouchDown];
        _button.backgroundColor = [UIColor clearColor];
        [_button setBackgroundImage:[UIImage imageNamed:kCloseAd] forState:UIControlStateNormal];
        _button.frame = CGRectMake(10, 10, 40, 40);
        _button.alpha = 0.75;
        [_adView insertSubview:_button aboveSubview:_adView];

        [UIView beginAnimations:@"animateAdBannerOn" context:nil];
        [UIView setAnimationDuration:1];
        [_adView setAlpha:1];
        [UIView commitAnimations];
    }
}

-(void)closeAd:(id)sender {
    [UIView beginAnimations:@"animateAdBannerOff" context:nil];
    [UIView setAnimationDuration:1];
    [_adView setAlpha:0];
    [UIView commitAnimations];

    _adView=nil;
    _requestingAd = NO;
    _button = nil;
    _interstitial.delegate = nil;
    _interstitial = nil;

    // notification for ad complete
    [[NSNotificationCenter defaultCenter] postNotificationName:@"adClosed" object:nil]; 
}

-(void)cancelAdverts{
    [_interstitial cancelAction];
    _adView=nil;
    _requestingAd = NO;
    _button = nil;
    _interstitial.delegate = nil;
    _interstitial = nil;
}

#pragma mark - IAD DELEGATE
-(void)interstitialAd:(ADInterstitialAd *)interstitialAd didFailWithError:(NSError *)error {
    [_interstitial cancelAction];
    _adView=nil;
    _requestingAd = NO;
    _button = nil;
    _interstitial.delegate = nil;
    _interstitial = nil;
    NSLog(@"Ad didFailWithERROR");
    NSLog(@"%@", error);

    // request another advert if it failed
    //[self requestFullScreenAd];
}

-(void)interstitialAdDidLoad:(ADInterstitialAd *)interstitialAd {
    if (interstitialAd.loaded) {
        _adLoaded = YES;
        [[NSNotificationCenter defaultCenter]postNotificationName:@"adLoaded" object:nil];
    }
    NSLog(@"Ad DidLOAD");
}

-(void)interstitialAdDidUnload:(ADInterstitialAd *)interstitialAd {
    [self closeAd:nil];
    NSLog(@"Ad DidUNLOAD");
}

-(void)interstitialAdActionDidFinish:(ADInterstitialAd *)interstitialAd {
    [self closeAd:nil];
    NSLog(@"Ad DidFINISH");
}

然后在我的关卡中完成SKScene:

#pragma mark - SCENE APPEARS
-(void)didMoveToView:(SKView *)view {
    // request an advert if advert removal is not purchased
    if (![[[UserDetails sharedManager]iapAdsRemoved]boolValue]) {
        // send request ad notification
        [[NSNotificationCenter defaultCenter]postNotificationName:@"requestAdvert" object:nil];
        // look for add loaded notification
        [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(adLoaded) name:@"adLoaded" object:nil];
        // look for add completed
        [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(adShowCompleted) name:@"adClosed" object:nil];
    }

    // setup UI
    [self createUI];

    if (![[UnlockController sharedManager]allunlocksOpen]) {
        // check all unlocks
        [[UnlockController sharedManager]checkUnlocks:[[UserDetails sharedManager]userTotalScore]+[[UserDetails sharedManager]userLevelScore]];

        // get the next unlock
        [self getNextUnlockScore];

        // set bar with correct increment
        [unlockBar setBarValues:[[UserDetails sharedManager]userTotalScore]+[[UserDetails sharedManager]userLevelScore] increment:[[UserDetails sharedManager]userTotalScore] nextObject:nextScore];
    }
    else{
        [self allUnlocksOpen];
    }

    // pre add button
    preAdButtonPress = 3;

    // variables
    startCount = 0;
    unlockItemsCount = 0;
    allUnlocks = [[UnlockController sharedManager]finalUnlockOpen];

    // start unlocks sequence
    [self performSelector:@selector(runRewards) withObject:nil afterDelay:1.0];
}

-(void)willMoveFromView:(SKView *)view{
    // cancel any adverts
    [[NSNotificationCenter defaultCenter]postNotificationName:@"cancelAdvert" object:nil];
    // remove observers
    [[NSNotificationCenter defaultCenter]removeObserver:@"adClosed"];
    [[NSNotificationCenter defaultCenter]removeObserver:@"adLoaded"];
}

是一些核心代码的内存问题,而不是导致内存泄漏的 iad。