【发布时间】:2013-06-29 07:31:43
【问题描述】:
对我来说,Objective-C 对环境做出反应、描述和干扰的能力就是它的所在。从根本上说,这首先具有在任何时候引用_cmd 并获得当前SEL 的坚定能力。从那里开始,您可以选择参与什么NSInvocation 咒语或运行时诡计。
现在,在一个块内,您仍然可以调用_cmd 并获得对当前“上下文”的模糊描述,即
__30-[RoomController awakeFromNib]_block_invoke123RoomController
描述性的? 是的。 信息丰富? 好的……但没那么有用。如何获取动态且准确的运行时信息inside 块,特别是调用签名、args 等?
I have found a useful little method to "describe" a block 提前提供了一个很好的例子,说明了我希望在区块内获得的信息类型。
typedef void(^blockHead)(NSString*);
blockHead v = ^(NSString*sandy) { NSLog(@"damnDog",nil); };
Log([v blockDescription]);
[v blockDescription] = <NSMethodSignature: 0x7fd6fabc44d0>
number of arguments = 2
frame size = 224
is special struct return? NO
return value: -------- -------- -------- --------
type encoding (v) 'v'
flags {}
modifiers {}
frame {offset = 0, offset adjust = 0, size = 0, size adjust = 0}
memory {offset = 0, size = 0}
argument 0: -------- -------- -------- --------
type encoding (@) '@?'
flags {isObject, isBlock}
modifiers {}
frame {offset = 0, offset adjust = 0, size = 8, size adjust = 0}
memory {offset = 0, size = 8}
argument 1: -------- -------- -------- --------
type encoding (@) '@"NSString"'
flags {isObject}
modifiers {}
frame {offset = 8, offset adjust = 0, size = 8, size adjust = 0}
memory {offset = 0, size = 8}
class 'NSString'
【问题讨论】:
-
除非你能以某种方式引用它,否则你无法真正了解块内部的块本身。 BTW,你为什么想知道这些信息?
-
随着块 API 的激增.. 通常很难告诉块的调用者等。编译器允许不匹配的签名...不正确的参数数量和多个具有相同名称的方法,但不同的块类型等 = 无怨无悔地共存......有时很高兴知道实际发生了什么......而不仅仅是“我认为”正在发生的事情。
-
你可以在调用它之前检查块的类型,但是你不能在块内做很多事情,因为它已经被调用了,可能参数不正确
-
Block 确实在第一个参数中传递了自己,如您所见,à la
self,但该参数的 name 在您的代码。没有办法参考它。我认为您能做的最好的事情就是围绕每个 Block 调用进行某种包装。 -
"现在,在一个块内.. 你仍然可以调用 _cmd 并获得当前“上下文”的模糊描述.. 即 __30-[RoomController awakeFromNib]_block_invoke123RoomController" 不,你不能。那不是来自
_cmd。
标签: objective-c objective-c-blocks introspection objective-c-runtime