作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
为了扩展开源项目的功能,我写了一个类来添加新方法。在这个新方法中,类需要从原来的类中访问一个内部方法,但是编译器说找不到这个方法(当然是内部的)。有什么方法可以为类别公开此方法吗?
编辑
不想修改原来的代码,所以不想在原来的类头文件中声明内部方法。
代码
在原来的类实现文件(.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.m
和 MyClass+SomeFunctionality.m
关于ios - 如何在 Objective-C 类别中使用内部方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16344608/
我是一名优秀的程序员,十分优秀!