AppCommons.h
#import <Foundation/Foundation.h>
#import <StoreKit/StoreKit.h>
@interface AppCommons : NSObject <SKProductsRequestDelegate,SKRequestDelegate>
- (void) getInAppPrice : (NSString *) inAppIdentifier;
@end
AppCommons.m
#import "Config.h"
#import "AppCommons.h"
#import "AppDelegate.h"
#import "ASIHTTPRequest.h"
#import "ASIFormDataRequest.h"
@implementation AppCommons
SKProductsRequest *productsRequest;
- (void) getInAppPrice : (NSString *) inAppIdentifier {
NSSet *productIdentifiers = [NSSet setWithObject:inAppIdentifier ];
productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
productsRequest.delegate = self;
[productsRequest start];
// we will release the request object in the delegate callback
}
#pragma mark -
#pragma mark SKProductsRequestDelegate methods
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
for(SKProduct *product in response.products)
{
NSLog(@"Product Price : %@",product.price);
NSLog(@"Product Price Locale : %@",product.priceLocale);
}
}
@end
这是我的班级以获得应用内购买的费用。我使用以下行从另一个类调用 getInAppPrice 方法
AppCommons *appCommon = [[AppCommons alloc] init];
[appCommon getInAppPrice:inAppProductIdentifier];
收到回复后我收到以下错误
“ * - [AppCommons respondsToSelector:]:发送到解除分配的实例0xd4f0580的消息
请帮忙..谢谢。
答案 0 :(得分:2)
我怀疑你是在方法的范围内这样做的,如下所示:
- (void)myMethod {
AppCommons *appCommon = [[AppCommons alloc] init];
[appCommon getInAppPrice:inAppProductIdentifier];
}
表示方法返回时将销毁appCommon
。
而是创建一个实例变量或属性,以便AppCommons
对象的生命周期超过此方法调用。
MyClass.h:
@class AppCommons;
@interface MyClass : NSObject {
AppCommons *_appCommons;
}
...
@end
MyClass.m:
#import "MyClass.h"
#import "AppCommons.h"
@implementation MyClass
- (id)init {
self = [super init];
if (self) {
_appCommons = [[AppCommons alloc] init];
}
return self;
}
- (void)myMethod {
[_appCommons getInAppPrice:inAppProductIdentifier];
}
@end
答案 1 :(得分:1)
这本身不是答案,而是对错误原因的解释。 trojanfoe给出的答案绝对正确,但并不能完全解释这种情况。
你正在调用一些函数:
- (void)myMethod {
AppCommons *appCommon = [[AppCommons alloc] init];
[appCommon getInAppPrice:inAppProductIdentifier];
}
在此函数中,您调用getInAppPrice
创建一个新对象,并将该新对象的委托设置为appCommon
。然后该对象在后台等待。
这就是你的问题所在。当第二个对象在后台等待时,您的appCommon
对象将被释放,因为代码到达函数的末尾并释放appCommon
。如果您的SKProductsRequest
委托属性不弱,那么您的appCommon
仍然会有一个保留计数为1,但由于它不是,那么您的appCommon
在您的函数结束后保留计数为0因此,ARC将内存视为可重用并释放对象。
然后,您会在SKProductsRequest
对象的后台获得回复。它检查它的委托指针(指针仍然是一个有效的指针,但它现在指向一个释放的对象(或者更糟的是,一个完全不同的对象)),看它是否响应委托函数。这是对被释放对象的调用。
因此,trojanfoe的回答是使appCommons
对象成为一个类变量,以便在函数结束时重新生成它是正确的答案。重新获得