我设置Category .h文件的方式有什么问题?

时间:2016-01-14 16:26:38

标签: objective-c ios9 categories

我有一个iOS 9.0应用程序,我正在尝试添加应用程序内购买; (我之前从未使用过IAP,并在线发现了一些希望让我开始使用的代码)。

我决定让代码驻留在一个类别中以简化维护(我之前只使用过一次类别)。也就是说,我对类别的实际结构有疑问。这是类别中的.h文件代码:

#import "SettingsViewController.h"
#import <StoreKit/StoreKit.h>

@interface SettingsViewController (Purchases)

@end

#define kInAppPurchaseManagerProductsFetchedNotification
@"kInAppPurchaseManagerProductsFetchedNotification"

@interface InAppPurchaseManager : NSObject <SKProductsRequestDelegate>  {

SKProduct *proUpgradeProduct;
SKProductsRequest *productsRequest;
}

@end

这是.m代码:

#import "SettingsViewController+Purchases.h"

@implementation SettingsViewController (Purchases)

- (void)requestProUpgradeProductData {

NSSet *productIdentifiers = [NSSet setWithObject:@"com.runmonster.runmonsterfree.upgradetopro" ];
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  {

NSArray *products = response.products;
proUpgradeProduct = [products count] == 1 ? [[products firstObject] retain] : nil;
if (proUpgradeProduct)
{
    NSLog(@"Product title: %@" , proUpgradeProduct.localizedTitle);
    NSLog(@"Product description: %@" , proUpgradeProduct.localizedDescription);
    NSLog(@"Product price: %@" , proUpgradeProduct.price);
    NSLog(@"Product id: %@" , proUpgradeProduct.productIdentifier);
}

for (NSString *invalidProductId in response.invalidProductIdentifiers)
{
    NSLog(@"Invalid product id: %@" , invalidProductId);
}

// finally release the reqest we alloc/init’ed in requestProUpgradeProductData
[productsRequest release];

[[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerProductsFetchedNotification object:self userInfo:nil];
}

@end

问题是.m文件无法使用SKProduct和SKProductsRequest,我确信这是由我设置.h文件的方式引起的。非常感谢帮助。

1 个答案:

答案 0 :(得分:1)

您似乎试图将某个类别用于不合适的目的。特别是,您的类别看起来应该包含属性声明。但是,正如the documentation所说:

  

类别可用于声明实例方法或类方法,但通常不适用于声明其他属性。在类别接口中包含属性声明是有效的语法,但是不可能在类别中声明其他实例变量。这意味着编译器不会合成任何实例变量,也不会合成任何属性访问器方法。您可以在类别实现中编写自己的访问器方法,但除非已经由原始类存储,否则您将无法跟踪该属性的值。