Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何实现递归块?_Objective C_Recursion_Block_Aop - Fatal编程技术网

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在所有情况下都会阻止这种情况的发生(现在可能是因为编译器如何优化,但这是我们可以信赖的吗?)