对我来说,Objective-C 对环境做出反应、描述和干扰的能力就是它的所在。从根本上说,这始于_cmd
在任何时候都坚定不移地引用 并获取当前的能力SEL
。从那里开始,您NSInvocation
可以选择参与什么咒语或运行时的诡计。
现在,在一个块内,您仍然可以调用_cmd
并获得对当前“上下文”的模糊描述,即
__30-[RoomController awakeFromNib]_block_invoke123RoomController
描述性的?是的。 内容丰富?好吧...但不是那么有用。如何在块内获取动态且准确的运行时信息,特别是调用签名、参数等?
我找到了一个有用的小方法来提前“描述”一个块,它提供了一个很好的例子,说明我希望在块内获得的信息类型。
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'