【发布时间】:2014-04-04 20:53:26
【问题描述】:
这里的问题更像是一个教育问题。一小时前我开始想到这个 翻转乐高积木(我知道这很傻)。
据我所知,块是在堆栈上创建的对象。
假设A 是一个对象,这意味着我们可以这样做:
[A message];
基于此,如果一个块是一个对象,我们也可以这样做:
[block message];
我说的对吗?
当运行时看到它时,它会调用:
objc_msgSend(block, @selector(message), nil);
所以我的问题是,我们如何发送阻止消息?
如果可能的话,我想也可以发送一个带有块的参数的块消息?
而且,如果我们可以通过以下方式调用块:
block();
这是否意味着我们甚至可以将块作为消息 (SEL),因为块具有类似于方法的签名 void (^)(void)?
因为如果有可能,那么下面的内容真的会让我感到惊讶:
objc_msgSend(block, @selector(block), block);
或:
objc_msgSend(block1, @selector(block2), block3);
我希望我的想象力不会有点疯狂,我的理解不会在这里(请纠正我,如果是的话)。
【问题讨论】:
-
块文字有一个
invoke()函数指针。他们不需要objective-c 接口来调用。这将需要为每个具有不同参数布局的块文字创建一个唯一的 NSBlock 子类(块不仅是void (^)(void)),只是为了一个类型良好的调用方法。 -
这样,编译器可以完全控制必须生成的任何函数,并且在使用文字时,只需在堆栈上创建块并分配其函数指针。
-
@CodaFi 抱歉,您能否告诉我更多信息并告诉我如何通过更详细(即样本、推理等)完成所要求的内容,因为我仍然有点迷茫.谢谢。
-
@CodaFi 我并不是要以“坏”的方式做事,但对我来说,学习如何以非常规的方式做事最终会成为一种有益的教育。
-
您可以通过
imp_implementationWithBlock()将块用作方法IMP。请参阅下面的答案。
标签: ios objective-c macos objective-c-blocks objective-c-runtime