使用Alamofire创建条纹EphemeralKey时发生内存泄漏

在Xcode中使用调试内存图工具时,出现内存泄漏。我有回溯,它指向这一行代码

使用Alamofire创建条纹EphemeralKey时发生内存泄漏

这是调试存储器图在左面板上显示的内容

使用Alamofire创建条纹EphemeralKey时发生内存泄漏

在此显示根据此工具泄漏的“ malloc块”之一的图形。

使用Alamofire创建条纹EphemeralKey时发生内存泄漏

我已经附加了两个类来处理获得临时密钥的条纹。

class StripeApiClient: NSObject,STPCustomerEphemeralKeyProvider{

   //data
   static let sharedClient = StripeApiClient()
    var baseURLString: String? = nil
    var baseURL: URL {
        if let urlString = self.baseURLString,let url = URL(string: urlString) {
            return url
        } else {
            fatalError()
        }
    }
   deinit {
      print("stripe api client deinited" )
   }



   /**
    Creates custom key to be used to communicate to stripes serves privatly
    - Parameters:
      - apiVersion: with api version
    */
    func createCustomerKey(withAPIVersion apiVersion: String,completion: @escaping STPJSONResponseCompletionBlock) {
            let url = self.baseURL.appendingPathComponent(StripePaymentHelper.STRIPE_EMPHEMERAL_KEYS)
        if let userstripeID = User.getUsersDataFromUserDefaults()?.stripePaymentID{
            Alamofire.request(url,method: .post,parameters: [
                "api_version": apiVersion,"customerID" : userstripeID
                ],encoding: JSONEncoding.default,headers: nil)
                .validate(statusCode: 200..<300)
                .responseJSON { responseJSON in
                    switch responseJSON.result {
                    case .success(let json):
                        completion(json as? [String: AnyObject],nil)
                    case .failure(let error):
                        completion(nil,error)
                    }
            }
        }else{
            let ref = Firestore.firestore()
         if let authID = Auth.auth().currentUser?.uid{
            ref.collection(Strings.Database.USERS).document(authID).collection(Strings.Database.PRIVATE_INFO).document(Strings.Database.PAYMENT_INFO).getDocument { (snapshot,error) in
               guard let document = snapshot else {
                  print("Error fetching document: \(error!)")
                  return
               }

               guard let data = document.data() else{
                  if let error = error{
                     print("error parsing datat \(error)")
                  }

                  return
               }

               if let paymentID = data["stripe_payment_ID"] as? String{
                  Alamofire.request(url,parameters: [
                     "api_version": apiVersion,"customerID" : paymentID,],headers: nil)
                     .validate(statusCode: 200..<300)
                     .responseJSON { responseJSON in
                        switch responseJSON.result {
                        case .success(let json):
                           completion(json as? [String: AnyObject],nil)
                        case .failure(let error):
                           completion(nil,error)
                        }
                  }
               }
            }
         }
        }
    }

}


StripePayment Helper
class StripePaymentHelper{

   //Data
   static let sharedInstance = StripePaymentHelper()
   var stripePayment: STPPaymentContext?
   var customerContext: STPCustomerContext?
   var config: STPPaymentConfiguration?


   //UI
   var safariVC: SFSafariViewController!

   //String
   static let CloseSafariViewControllerNotification = "kCloseSafariViewControllerNotification"

   static var STRIPE_EMPHEMERAL_KEYS = "StripeEphemeralKeys"
   static var CREATE_USERS_PAYOUT_accOUNT = "CreateUsersPayoutaccount"
   static var GO_TO_USERS_CONNECT_DASHBOARD = "createStripeExpressDashboardLink"

   //Back end urls for both developement and production enviroments
   #if DEVELOPMENT
   var backendBaseURL = "URL"
   static var connectPayoutMethodURL = "URL"
   #else
   //var
   var backendBaseURL = "URL"
   static var connectPayoutMethodURL = "URL"
   #endif

   deinit {
      print("stripe payment helper deinited")
   }


   /**
    DEFAULT constructor used to prefetch payment data
    */
   init() {
      StripeApiClient.sharedClient.baseURLString = self.backendBaseURL
      self.customerContext = STPCustomerContext(keyProvider: StripeApiClient.sharedClient)
      let config = setUpPaymentConfiguration()
      stripePayment = STPPaymentContext(customerContext: self.customerContext!,configuration: config,theme: STptheme.default())
      self.customerContext?.retrieveCustomer({ (customer,error) in

         if let customer = customer{
            if (customer.sources.count) > 0{
               UserDefaults.standard.set(true,forKey: Strings.UserDefaults.USER_SETUP_PAYMENT)
            }else{
               UserDefaults.standard.removeObject(forKey: Strings.UserDefaults.USER_SETUP_PAYMENT)
            }
         }


      })
   }

   /**
    View controller constructor used to set up the ability for user to change or add payement on current VC
    - Parameters:
      - VC: view controller that wants to present payment info
    */
   init(VC: UIViewController) {
      StripeApiClient.sharedClient.baseURLString = self.backendBaseURL
      self.customerContext = STPCustomerContext(keyProvider: StripeApiClient.sharedClient)
      let config = setUpPaymentConfiguration()
      stripePayment = STPPaymentContext(customerContext: self.customerContext!,theme: STptheme.default())

      if let stripeID = UserDefaults.standard.string(forKey: Strings.UserDefaults.STRIPE_PAYMENT_ID){
         stripePayment?.defaultPaymentMethod = stripeID
      }
      stripePayment?.delegate = VC as? STPPaymentContextDelegate
      stripePayment?.hostViewController = VC
   }

   /**
    Sets up payment vc configuration
    */
   func setUpPaymentConfiguration() -> STPPaymentConfiguration{
      config = STPPaymentConfiguration.shared()
      config?.publishableKey = AppDelegate.STRIPE_PUBLISHABLE_KEY
      //config.appleMerchantIdentifier = self.appleMerchantID
      config?.companyName = "Hummingbiird"
      config?.requiredBillingAddressFields = .full
      //config.requiredShippingAddressFields = settings.requiredShippingAddressFields
      config?.shippingType = .delivery
      config?.additionalPaymentOptions = .all


      return config!
   }
}

我当时想这是因为我将视图控制器传递给了付款助手类,但是我删除了它,只是在Viewcontroller本身上设置了委托和主机控制器。但是还是造成了同样的泄漏。同样,这个内存图是我进出Viewcontroller的过程,它调用了条纹支付助手。如果有人能指出我正确的方向,将不胜感激。退出正在使用的viewcontroller时,还会调用StripePaymentHelper deinit的另一件事。

red0123450 回答:使用Alamofire创建条纹EphemeralKey时发生内存泄漏

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3048453.html

大家都在问