Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 应用内购买测试期间EXC\u访问错误_Iphone_Objective C_Xcode_In App Purchase_Storekit - Fatal编程技术网

Iphone 应用内购买测试期间EXC\u访问错误

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

为我的应用内购买运行测试(首次进行应用内购买)。我在代码的第三行获得EXC_BAD_访问权限:

    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文件!?