gpt4 book ai didi

ios - 应用因 UITabBarController 和应用内购买而崩溃

转载 作者:可可西里 更新时间:2023-11-01 05:45:08 24 4
gpt4 key购买 nike

我在应用购买中使用的应用和我的引用资料 here .

当我按 block 从服务器加载产品时,同时我切换到 UITabBarController 内的其他选项卡,加载产品时应用程序崩溃

这是我的代码

//Load products from server
[[LAInAppHelper sharedInstance] requestProductsWithCompletionHandler:^(BOOL success, NSArray *products) {
if (success) {
// even i do nothing in here app till crashed
}
}];

如果删除此行,我可以在任何选项卡之间切换。崩溃时应用程序没有抛出任何东西,即使我启用了僵尸对象。只是不好访问

最佳答案

tutorial that you linkedLAInAppHelper 的实现有问题: 助手将您的应用程序视为非并发。

事情是这样的:LAInAppHelper 的共享实例有一个 sharedInstance,它拥有 _completionHandler(除其他外)。

requestProductsWithCompletionHandler: 方法为 _completionHandler 分配已传入的 block 的副本。这对于第一个请求是可以的,但如果另一个请求“正在运行” ",由于这次重新分配,ARC 将释放该其他请求的完成 block 。如果您切换到的选项卡启动并发请求,则初始请求将返回到已释放的 block ,从而导致未定义的行为,并可能导致崩溃。

要解决此问题,您需要将类一分为二 - 一部分包含所有请求共有的项目(即 _productIdentifiers_purchasedProductIdentifiers)和请求-具体的(_productsRequest_completionHandler)。

第一个类的实例(我们称之为LAInAppHelper)保持共享;第二个类的实例(我们称之为 LAInAppHelperRequest)是在 requestProductsWithCompletionHandler: 方法中根据请求创建的。

-(id)initWithHelper:(LAInAppHelper*)helper
andCompletionHandler:(RequestProductsCompletionHandler)completionHandler {
if (self = [super init]) {
_completionHandler = [completionHandler copy];
_productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:helper.productIdentifiers]; // You will need to make productIdentifiers a property
_productsRequest.delegate = self;
[_productsRequest start];
}
return self;
}

您还需要创建一个包装 _completionHandler 的 block ,如下所示:

- (void)requestProductsWithCompletionHandler:(RequestProductsCompletionHandler)completionHandler {
__block LAInAppHelperRequest *req = [[LAInAppHelperRequest alloc] initWithHelper:self andCompletionHandler:^(BOOL success, NSArray *products) {
completionHandler(success, products);
req = nil;
}];
}

关于ios - 应用因 UITabBarController 和应用内购买而崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17714753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com