一个块最终成为 type 的一个实例__NSGlobalBlock__
,如下面的代码片段所示:
无效(^aBlock)(无效)= ^(无效){
NSLog(@"Hello world");
};
// 打印“type = __NSGlobalBlock__”
NSLog(@"type = %@", [aBlock 类]);
为了创建一个类的类别,编译器需要能够看到@interface
该类的原始声明。我找不到声明__NSGlobalBlock__
,可能是有充分理由的。
本文和本文包含一些关于块实现的有用信息。
就您最初的观点而言,为什么不NSArray
为您的mapTo
方法创建一个类别?对于这种功能来说,这似乎是一个更好的地方。
更新
假设您可以向 Block 对象添加一个类别。您将如何从类别的方法中调用该块?据我所知,调用块的唯一方法是通过()
运算符(例如,aBlock()
)。我认为没有办法从 Block 对象中分辨出参数的数量和类型。那么,您会将哪些参数传递给块调用?
我不建议你这样做,但以下工作......
@interface NSObject(块扩展)
- (无效)富;
@结尾
@implementation NSObject(块扩展)
-(无效)富
{
// 不确定如何确定 self 是否是块,因为两者都不是
// __NSGlobalBlock__ 也不是它的任何超类(除了 NSObject)
// 编译器可以访问
if ([[[self class] description] isEqual:@"__NSGlobalBlock__"])
{
NSLog(@"foo");
// 怎么办?
// 不能调用 self(),它不会编译
// 我还能怎么调用这个块?
}
}
@结尾
...
无效(^aBlock)(无效)= ^(无效){
NSLog(@"Hello world");
};
// 打印“foo”
[aBlock foo];