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]。所以是的。那就在那里,不知道该怎么做。任何帮助表示赞赏。
更新:修正意外地留在了增加额外的交易观察者笑
您需要保留正在创建
- (void)viewDidLoad {
//... stuff
SKProduct* electronicProduct = //...
[electronicProduct retain];
//... otherstuff
}
viewDidLoad中由系统在自动释放池包裹目标代码,paymentWithProduct:返回一个autorelease对象。当viewDidLoad完成时,所有的autorelease对象都被释放,这就是为什么当你稍后尝试访问它时,你会遇到不好的内存访问。
我有同样的问题,我的解决办法是要求
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
在离开的In-App Store里我的应用程序。 也许它将在未来帮助某人。
似乎这个问题是在删除前一个事件之前尝试添加一个事务观察者。以下添加到您的控制器来解决这个问题:
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}
希望这有助于!
我有同样的错误,真的很容易解决。在我的头文件我有一个SKProduct声明:
@property SKProduct *product;
我只是把它改为:
@property (retain) SKProduct *product;
,这一切工作正常。 希望这可以帮助别人。
似乎解决了我的问题。 – NSGodMode
Mr.T答案是最好的解决方案!
在SWIFT我把这个removeTransactionObserver这里:
deinit {
SKPaymentQueue.defaultQueue().removeTransactionObserver(self)
}
你在哪里做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
}
// ...
}
在electronicProd定义,你叫保留的消息?每个事件都被包裹在一个自动释放池,如果您的实例化对象与它的静态init方法,该项目将被发布一次viewDidLoad方法结束。 – andreamazz
你要问,如果我不喜欢: electronicPack = [SKProduct的alloc]初始化] ?答案是否定的。如果那不是你要求的那么我不知道你在说什么,我有点新的这个球赛。大声笑 –
我不太好整个内存管理,财产的东西。和所有这一切。只有约一个月的编程,并没有完全采取这一点呢。我给一个尝试寿,看看是否能解决什么 编辑:实现的self.elec..etc的东西,并没有变化。当应用程序崩溃时仍然出现错误 –