gpt4 book ai didi

ios - 如何在 Objective-C 类别中使用内部方法?

转载 作者:可可西里 更新时间:2023-11-01 04:35:44 25 4
gpt4 key购买 nike

为了扩展开源项目的功能,我写了一个类来添加新方法。在这个新方法中,类需要从原来的类中访问一个内部方法,但是编译器说找不到这个方法(当然是内部的)。有什么方法可以为类别公开此方法吗?

编辑

不想修改原来的代码,所以不想在原来的类头文件中声明内部方法。

代码

在原来的类实现文件(.m)中,我有这个方法实现:

+(NSDictionary*) storeKitItems
{
return [NSDictionary dictionaryWithContentsOfFile:
[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:
@"MKStoreKitConfigs.plist"]];
}

在类别中,我想添加这个方法:

- (void)requestProductData:(NSArray *(^)())loadIdentifierBlock
{
NSMutableArray *productsArray = [NSMutableArray array];
NSArray *consumables = [[[MKStoreManager storeKitItems] objectForKey:@"Consumables"] allKeys];
NSArray *nonConsumables = [[MKStoreManager storeKitItems] objectForKey:@"Non-Consumables"];
NSArray *subscriptions = [[[MKStoreManager storeKitItems] objectForKey:@"Subscriptions"] allKeys];
if(loadIdentifierBlock != nil) [productsArray addObjectsFromArray:loadIdentifierBlock()];
[productsArray addObjectsFromArray:consumables];
[productsArray addObjectsFromArray:nonConsumables];
[productsArray addObjectsFromArray:subscriptions];
self.productsRequest.delegate = self;
[self.productsRequest start];
}

在我调用 storeKitItems 的每一行中,编译器都说:Class method "+storeKitItems"not found ...

最佳答案

这很简单,对方法进行前向声明。

不幸的是,在 obj-c 中,每个方法声明都必须在 @interface 中, 所以你可以让它在你的类别中工作 .m文件与另一个内部类别,例如

@interface MKStoreManager (CategoryInternal)
+ (NSDictionary*)storeKitItems;
@end

不需要实现,这只告诉编译器方法在别处,类似于@dynamic具有属性。

如果您只对删除警告感兴趣,您也可以将类转换为 id ,以下也应该有效:

NSDictionary* dictionary = [(id) [MKStoreManager class] storeKitItems];

但是,我最喜欢的解决方案是做一些不同的事情,让我们假设以下示例:

@interface MyClass
@end

@implementation MyClass

-(void)internalMethod {
}

@end

@interface MyClass (SomeFunctionality)
@end

@implementation MyClass (SomeFunctionality)

-(void)someMethod {
//WARNING HERE!
[self internalMethod];
}

@end

我的解决方案是将类(class)分成两部分:

@interface MyClass
@end

@implementation MyClass
@end

@interface MyClass (Internal)

-(void)internalMethod;

@end

@implementation MyClass (Internal)

-(void)internalMethod {
}

@end

并包括MyClass+Internal.h来自 MyClass.mMyClass+SomeFunctionality.m

关于ios - 如何在 Objective-C 类别中使用内部方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16344608/

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