在Xcode中使用调试内存图工具时,出现内存泄漏。我有回溯,它指向这一行代码
我已经附加了两个类来处理获得临时密钥的条纹。
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的另一件事。