【问题标题】:EXC_BAD_ACCESS during in app purchase test应用内购买测试期间的 EXC_BAD_ACCESS
【发布时间】:2011-08-22 11:06:24
【问题描述】:

为我的应用内购买运行测试(第一次进行应用内购买)。我在这段代码的第三行得到 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]。所以是的。这就是我所在的地方,不知道该怎么办。任何帮助表示赞赏。

更新:FIXED 意外遗留在添加额外事务观察器的代码中,哈哈

【问题讨论】:

  • 在electronicProd定义中,你调用retain消息了吗?每个事件都包装在一个自动释放池中,如果你用它的静态 init 方法实例化你的对象,一旦 viewDidLoad 方法结束,项目就会被释放。
  • 你问我是否喜欢:electronicPack = [SKProduct alloc] init]?答案是否定的。如果那不是你要问的,那么我不确定你在说什么,我对这个球赛有点陌生。大声笑
  • 我对整个内存管理和属性的东西不太好。以及所有这些。只编程了大约一个月,还没有完全掌握它。我会尝试一下,看看它是否能解决任何问题 编辑:实施了 self.elec..etc 的东西,没有任何改变。仍然出错
  • 当应用程序崩溃时,在 gdb 窗口中输入 t a a bt (thread apply all bt) 并告诉我们您的想法
  • 好的,你用的是静态方法,我会回复的,这样就更清楚了。

标签: iphone objective-c xcode in-app-purchase storekit


【解决方案1】:

我也遇到了同样的问题,我的解决办法是打电话

[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];

在我的应用中离开应用内商店。 也许将来会对某人有所帮助。

【讨论】:

  • 你拯救了我的一天!谢谢!
  • 噢..太好了..谢谢
【解决方案2】:

似乎问题出在尝试在删除前一个事务观察器之前添加一个事务观察器。将以下内容添加到您的控制器以解决此问题:

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

希望这会有所帮助!

【讨论】:

  • 这就是我的答案。对于 Xcode 6.3 和 iOS 8.3 仍然有效
  • 太好了,谢谢!!对我来说,这也有效,使用 Mihael Isaev(下)的​​代码并将其放入 ViewDidDisappear。
【解决方案3】:

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

我在这里快速调用 removeTransactionObserver:

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

【讨论】:

  • 你在哪里做deinit!? appdelegate 文件!?
【解决方案4】:

你需要保留你正在创建的对象

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

viewDidLoad 被系统包装在一个自动释放池中,paymentWithProduct: 返回一个自动释放对象。当 viewDidLoad 完成后,所有的 autorelease 对象都会被释放,这就是为什么当你稍后尝试访问它时会得到一个错误的内存访问。

【讨论】:

    【解决方案5】:

    我有同样的错误,解决起来很简单。在我的头文件中,我声明了一个 SKProduct:

    @property SKProduct *product;
    

    我刚刚改成:

    @property (retain) SKProduct *product;
    

    一切正常。 希望这对某人有所帮助。

    【讨论】:

      【解决方案6】:

      如果您要为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
          }
      
          // ...
      }
      

      【讨论】:

        【解决方案7】:

        我有同样的问题,我的解决方案是致电 [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-02-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-15
          • 1970-01-01
          相关资源
          最近更新 更多