Расстраивающая утечка памяти при загрузке промежуточной рекламы в Swift - PullRequest
0 голосов
/ 27 апреля 2019

Я имею дело с невероятной утечкой памяти при загрузке промежуточной рекламы через AdMob. При наблюдении за памятью в Xcode & Instruments, память скачет на 10 МБ каждый раз, когда я посещаю контроллер представления, на котором размещена реклама. Кроме того, при закрытии приложения на моем телефоне и повторном его открытии также увеличивается объем памяти на 30-40 Мб, что просто смешно.

Я попытался профилировать это в приборах, и выделяемая память - это все системные библиотеки, и ничто не указывает на то, что не так. Я прочитал другие ответы о переполнении стека, такие как ADMOB Утечка памяти? но никакой ответ не помог мне до сих пор. Может кто-нибудь подскажет, что не так с моим кодом? Я следовал за точной документацией AdMob, которая https://developers.google.com/admob/ios/interstitial, и все прекрасно работает, кроме этой безумной утечки памяти. Вот точный код, который вызывает утечку ниже.


class ViewController: UIViewController, GADInterstitialDelegate {

var interstitial: GADInterstitial!

override func viewDidLoad() {
  interstitial = createAndLoadInterstitial()
  interstitial.delegate = self
}

func update() {
        if interstitial.isReady {
            interstitial.present(fromRootViewController: self)
        }
    }

    func createAndLoadInterstitial() -> GADInterstitial {
        let interstitial = GADInterstitial(adUnitID: "ca-app-pub-3940256099942544/4411468910")
        interstitial.delegate = self
        let request = GADRequest()
        interstitial.load(request)
        return interstitial
    }

    func interstitialDidDismissScreen(_ ad: GADInterstitial) {
        interstitial = createAndLoadInterstitial()
    }

// I am calling update() inside a button when pressed in this VC.

1 Ответ

0 голосов
/ 26 мая 2019

Я просто хочу сказать, что это на самом деле было решено мной.Я сделал как один из выше изложенных в комментариях.Я взял свой код, который находился на контроллере представления, в котором размещалась промежуточная реклама, и переместил его делегату приложения.Я просто ссылался на промежуточный рекламный объект всякий раз, когда он мне нужен в моем проекте.Это вернуло память к тому, что она выделяла при посещении контроллера, на котором размещалась реклама.Для тех, кто хочет увидеть очень простой пример того, как это выглядит в делегате приложения:

import UIKit
import GoogleMobileAds

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, GADInterstitialDelegate {

    var myInterstitial: GADInterstitial!

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        GADMobileAds.sharedInstance().start(completionHandler: nil)
        myInterstitial = createAndLoadInterstitial()
        return true
    }

    func createAndLoadInterstitial() -> GADInterstitial {
        let interstitial = GADInterstitial(adUnitID: "yourAdID")
        interstitial.delegate = self
        let request = GADRequest()
        interstitial.load(request)
        return interstitial
    }

    func interstitialDidDismissScreen(_ ad: GADInterstitial) {
        myInterstitial = createAndLoadInterstitial()
    }
...