Objective c 如何实现递归块?
我想声明一个块类型,它使用一个相同块类型的参数。就是这样,Objective c 如何实现递归块?,objective-c,recursion,block,aop,Objective C,Recursion,Block,Aop,我想声明一个块类型,它使用一个相同块类型的参数。就是这样, typedef void (^BlockInBlock) (BlockInBlock block); @interface NSObject(AOP) - (void) invokeBlockInBlock:(BlockInBlock) headBlock, ...{ va_list blockList; va_start(blockList, headBlock); // Invoke recursive
typedef void (^BlockInBlock) (BlockInBlock block);
@interface NSObject(AOP)
- (void) invokeBlockInBlock:(BlockInBlock) headBlock, ...{
va_list blockList;
va_start(blockList, headBlock);
// Invoke recursive blocks here until the value of va_arg(blockList, BlockInBlock) is nil
// it would be like: block1(self, block2(self, block3(self, block4(...))));
va_end(blockList);
}
@end
我知道声明是无效的。但我想知道是否有任何可能的方法来实现递归块,它只需要一个相同块类型的参数
我正在试图找到一种使用block在Objective-C中实现面向方面编程(AOP)的方法。以下是我关于如何实现这一点的问题 进一步的问题1: 如何实现一个包含我上面描述的许多块的函数,并以
nil
结束,我可以用许多块调用该函数,直到满足nil?是这样的:
typedef void (^BlockInBlock) (BlockInBlock block);
@interface NSObject(AOP)
- (void) invokeBlockInBlock:(BlockInBlock) headBlock, ...{
va_list blockList;
va_start(blockList, headBlock);
// Invoke recursive blocks here until the value of va_arg(blockList, BlockInBlock) is nil
// it would be like: block1(self, block2(self, block3(self, block4(...))));
va_end(blockList);
}
@end
进一步的问题2:
如果递归块有一个返回值怎么办
关于C语言的附加问题:
是否可以声明一个C函数,该函数使用的一个参数是C函数指针,而该C函数指针的函数也使用另一个C函数指针?通过在块引用中捕获块来实现这一点要容易得多。实际上,C中的泛型类型的前向声明是不受支持的。那么,这可能是唯一的解决方案
__block void(^strawberryFields)();
strawberryFields = ^{ strawberryFields(); };
strawberryFields();
请注意,如果您计划异步调度该块,则必须在分配之前复制它(在ARC下可能不再需要此操作):
这可能与您正在寻找的类似:
typedef void (^Block)(id);
从字面上讲,它将导致无限递归循环:
Block _block;
_block = ^(Block block) {
if (block) block(block);
};
_block(_block);
但是,参数可以是任何id
,不仅可以是完全相同的块
,还可以表示如何将同一块作为同一块的参数传递
所以,就是这个想法。看看你关于C的问题。没有经过很多思考,我怀疑区块问题最终会是类似的。有趣的是,每个人在发布这些示例时都追求无限递归…)酷。有可能让两个或更多的块在循环中互相调用吗?例如:blockA->blockB->BlockC->blockA->@李岡諭, 是的,这是可能的。请检查我关于如何实现连续调用多个块的最新问题。多谢各位!您的声明没有将另一个块作为参数。这不是我想要的。不管怎样,谢谢你的回答。有没有办法在没有保留周期的情况下做到这一点?(在ARC下)Xcode 5在第2行警告“在该块中强烈捕获“strawberryFields”可能会导致保留周期”,并且仪器测试似乎验证了此处是否存在泄漏(假设您添加代码以避免无限递归:
uu block int counter=4;u block void(^strawberryFields));strawberryFields=[^{if(计数器-->0)strawberryFields();else NSLog(@“bye”)}copy];dispatch_async(dispatch_get_global_queue(dispatch_queue_PRIORITY_DEFAULT,0),strawberryFields);
ugh。很抱歉,这种格式。注释对于出现的代码不是很好(或者我错过了一个技巧)。这表明需要\uuuu block
和\uuuu weak
,但我仍然看到“将块文字分配给弱变量;对象将在分配后释放”的警告,而且我并不100%清楚,将分配级联到强var在所有情况下都会阻止这种情况的发生(现在可能是因为编译器如何优化,但这是我们可以信赖的吗?)