Iphone 应用内购买测试期间EXC\u访问错误
为我的应用内购买运行测试(首次进行应用内购买)。我在代码的第三行获得EXC_BAD_访问权限:Iphone 应用内购买测试期间EXC\u访问错误,iphone,objective-c,xcode,in-app-purchase,storekit,Iphone,Objective C,Xcode,In App Purchase,Storekit,为我的应用内购买运行测试(首次进行应用内购买)。我在代码的第三行获得EXC_BAD_访问权限: SKPayment *payment = [SKPayment paymentWithProduct:electronicProd]; [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; [[SKPaymentQueue defaultQueue] addPayment:payment]; 正在对按钮执行i
SKPayment *payment = [SKPayment paymentWithProduct:electronicProd];
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] addPayment:payment];
正在对按钮执行iAction。electronicPack在标题中声明为SKProduct。在productsRequest didReceiveResponse中抛出了一些NSLogs,当请求产品时(在viewDidLoad中),他们显示它正确地获取了产品并将其存储在electronicPack中。在didReceiveResponse页面中将electronicPack定义为[[request.products]objectAtIndex:0]。是的。这就是我的处境,我不知道该怎么办。感谢您的帮助
更新:修复了添加额外事务观察器lol的代码中意外遗留的问题。您需要保留正在创建的对象
- (void)viewDidLoad {
//... stuff
SKProduct* electronicProduct = //...
[electronicProduct retain];
//... otherstuff
}
viewDidLoad由系统包装在自动释放池中,paymentWithProduct:返回自动释放对象。当viewDidLoad完成时,所有的autorelease对象都被释放,这就是为什么当您稍后尝试访问它时,会得到错误的内存访问。我也遇到同样的问题,我的解决方案是调用
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
在我的应用程序中离开应用程序内商店时。
也许它将来会对某些人有所帮助。问题似乎在于在删除前一个事务观察器之前尝试添加事务观察器。将以下内容添加到控制器以解决此问题:
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}
希望这有帮助 我也犯了同样的错误,很容易解决。在我的头文件中,我声明了一个SKProduct:
@property SKProduct *product;
我刚把它改成:
@property (retain) SKProduct *product;
一切都很好。
希望这对某人有所帮助。T先生的回答是最好的解决方案 在swift中,我将此称为removeTransactionObserver:
deinit {
SKPaymentQueue.defaultQueue().removeTransactionObserver(self)
}
我也有同样的问题,我的解决办法是打电话 [[SKPaymentQueue defaultQueue]removeTransactionObserver:self]
on store observer transaction finish/failed/completed回调如果要为
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
}
// ...
}
在electronicProd的定义中,您是否调用了保留消息?每个事件都包装在一个自动释放池中,如果您使用对象的静态init方法实例化了对象,那么一旦viewDidLoad方法结束,该项将被释放。您是否询问我是否喜欢:electronicPack=[SKProduct alloc]init]?答案是否定的。如果这不是你要问的,那么我不确定你在说什么,我对这个球赛有点陌生。洛林不太擅长整个内存管理和属性。诸如此类。我只做了大约一个月的编程,还没有完全学会。我会尝试一下,看看它是否修复了任何编辑:实现了self.elec…等内容,没有任何更改。仍然会出错当应用程序崩溃时,在gdb窗口中键入t a bt(线程应用所有bt)并告诉我们您想出了什么好的,所以您使用的是静态方法,我会回复以便更清楚。您救了我一天!谢谢哦呼。。伟大的谢谢这是我的答案。对于Xcode 6.3和iOS 8.3仍然有效非常好,谢谢!!对我来说,使用Mihael Isaev(以下)的代码并将其放入ViewDidEnglishe中,这同样有效。你在哪里做Denit!?appdelegate文件!?