EXC_BAD_ACCESS在应用程序购买测试期间

问题描述:

为我的应用程序购买(第一次在应用程序购买时)运行测试。我得到这个代码的第三行EXC_BAD_ACCESS:EXC_BAD_ACCESS在应用程序购买测试期间

SKPayment *payment = [SKPayment paymentWithProduct:electronicProd]; 
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
    [[SKPaymentQueue defaultQueue] addPayment:payment]; 

的是一个按钮的IBAction为下。 electronicPack在标题中声明为SKProduct。在productsRequest didReceiveResponse中引入了一些NSLog,并且在产品被请求时(在viewDidLoad中),他们表明它正确地获取产品并将其存储在electronicPack中。在didReceiveResponse页面中将定义的electronicPack定义为[[request.products] objectAtIndex:0]。所以是的。那就在那里,不知道该怎么做。任何帮助表示赞赏。

更新:修正意外地留在了增加额外的交易观察者笑

+0

在electronicProd定义,你叫保留的消息?每个事件都被包裹在一个自动释放池,如果您的实例化对象与它的静态init方法,该项目将被发布一次viewDidLoad方法结束。 – andreamazz

+0

你要问,如果我不喜欢: electronicPack = [SKProduct的alloc]初始化] ?答案是否定的。如果那不是你要求的那么我不知道你在说什么,我有点新的这个球赛。大声笑 –

+0

我不太好整个内存管理,财产的东西。和所有这一切。只有约一个月的编程,并没有完全采取这一点呢。我给一个尝试寿,看看是否能解决什么 编辑:实现的self.elec..etc的东西,并没有变化。当应用程序崩溃时仍然出现错误 –

您需要保留正在创建

- (void)viewDidLoad { 
    //... stuff 
    SKProduct* electronicProduct = //... 
    [electronicProduct retain]; 
    //... otherstuff 
} 

viewDidLoad中由系统在自动释放池包裹目标代码,paymentWithProduct:返回一个autorelease对象。当viewDidLoad完成时,所有的autorelease对象都被释放,这就是为什么当你稍后尝试访问它时,你会遇到不好的内存访问。

我有同样的问题,我的解决办法是要求

[[SKPaymentQueue defaultQueue] removeTransactionObserver:self]; 

在离开的In-App Store里我的应用程序。 也许它将在未来帮助某人。

+1

你救了我的一天!谢谢! –

+0

Ohhoo ..大..感谢 –

+0

为我工作为好,谢谢! – JustMe

似乎这个问题是在删除前一个事件之前尝试添加一个事务观察者。以下添加到您的控制器来解决这个问题:

- (void)viewDidDisappear:(BOOL)animated 
{ 
    [super viewDidDisappear:animated]; 
    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self]; 
} 

希望这有助于!

+1

这是我的答案。仍然适用于Xcode 6.3和iOS 8.3 – Paul

+2

非常好,谢谢!对我来说,这也工作,使用来自Mihael Isaev(下面)的代码并将其放入ViewDidDisappear中。 – Pieter

我有同样的错误,真的很容易解决。在我的头文件我有一个SKProduct声明:

@property SKProduct *product; 

我只是把它改为:

@property (retain) SKProduct *product; 

,这一切工作正常。 希望这可以帮助别人。

+0

似乎解决了我的问题。 – NSGodMode

Mr.T答案是最好的解决方案!

在SWIFT我把这个removeTransactionObserver这里:

deinit { 
    SKPaymentQueue.defaultQueue().removeTransactionObserver(self) 
} 
+0

你在哪里做deinit!? appdelegate文件!? – Learn2Code

我有同样的问题,我的解决办法是要求 [SKPaymentQueue defaultQueue] removeTransactionObserver:自我]。

在商店观察者交易完成/失败/完成回调

如果您正在为SKPaymentTransactionObserver专用类不要忘记,它必须被保留。

我意识到这之前得到了错误,这里是在AppDelegate一个例子:

class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 
    var myTransactionObserver: MyTransactionObserver! 


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

     // don't 
     let myTransactionObserver = MyTransactionObserver() 

     // do 
     myTransactionObserver = MyTransactionObserver() 

     SKPaymentQueue.default().add(myTransactionObserver) 

     return true 
    } 

    // ... 
}