- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题如标题所述。显然,第一个参数用于此指针,有点像 c++。第二个参数呢?谢谢你。
最佳答案
objc_msgSend()
的签名是:
id objc_msgSend(id self, SEL op, ...);
每个方法调用都被编译为对该函数的调用。即,如果您调用:
[anArray objectAtIndex:42];
这将被编译为:
objc_msgSend(anArray, @selector(objectAtIndex:), 42);
现在,对于你的问题,为什么方法被编译成一个以 SEL 作为第二个参数的函数。或者,更具体地说,为什么是这种方法:
- (id)objectAtIndex:(NSUInteger)index;
完全等价于这个 C 函数:
id object_at_index(id object, SEL _cmd, NSUInteger index);
答案是速度 speed speed。
具体来说,通过这样做,objc_msgSend()
永远不必重写堆栈帧*,它还可以使用尾调用优化直接跳转到方法调用。这就是为什么您永远不会在调试器的回溯中看到 objc_msgSend()
的原因(除了当您在 Messenger 中实际崩溃/中断时)。
objc_msgSend()
使用 object
和 _cmd
来查找方法的实现,然后,从字面上看,跳转到那个实现。
非常快。堆栈框架未受影响。
而且,正如其他人所说,出于各种原因,在方法实现中使用 _cmd
可能很方便。同样,这也意味着 Messenger 可以使用巧妙的技巧,例如通过 NSInvocation 等提供代理支持。
*重写栈帧可能会异常复杂和昂贵。一些参数有时可能在寄存器中,等等......所有依赖于架构的 ABI 肮脏。编写诸如 imp_implementationWithBlock()
之类的东西的最大挑战之一是弄清楚如何不接触堆栈,因为这样做太慢而且太臃肿以至于无法实现可行。
关于objective-c - "id (*IMP)(id, SEL, ...) "中的第二个参数是做什么用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14305191/
例如: import subprocess p=subprocess.Popen("imp -help",stdout=subprocess.PIPE,stdin=subprocess.PIPE) o
我最近开始使用导入来更好地组织我在 python 中的代码。我在 file1.py 中的原始代码使用了以下行: def foo(): files = [f for f in os.listdi
根据imp.load_module文档,“调用方负责关闭文件参数”。“如果我将从imp.find_module返回到imp.load_module的文件对象,我仍然负责关闭文件对象吗?”或者帮我关上它
这个问题在这里已经有了答案: How to ignore deprecation warnings in Python (17 个答案) 关闭 4 年前。 每当我尝试在 PyCharm 中使用“sk
我使用的是python2.5。我需要动态导入一个模块,然后在更改时重新加载。我如何实现这一目标。 我在下面的示例中尝试过 - 不起作用: import imp modfile = 'mymod_inf
我的应用程序具有以下布局: /wsgi/myapp/__init__.py /wsgi/application /app.py 文件_init_.py: from flask import Flask
对于某些Python项目,我在config模块中定义了默认配置。可以通过使用 rc 文件来进行定制 config = imp.load_source('config', 'some_rc_file')
我的一些程序运行没有问题,但我仍然收到以下错误代码。它对程序本身没有影响,但我仍然想解决它。 C:\Program Files\JetBrains\PyCharm Community Edition
我有一个执行以下操作的脚本: import imp imp.load_source("storage_configuration_reader","/bi/opt/RNAspace/rnaspace_
我只是在插入数组时遇到了麻烦...让子项从根或“父项”分支出来。 我一直在尝试将数据插入到基于数组的 BST 实现中: BST::BST(int capacity) : items(new item[
我设置了一个类,理想情况下它将读取传入的任何类的方法,然后在运行时将它们全部映射到单个选择器,然后再将它们转发到它们的原始选择器。 这现在确实有效,但我一次只能对一种方法执行此操作。问题似乎是,一旦我
是否可以创建一个 IMP,其中参数的数量与正在解析的实例方法的选择器相匹配? 我可以使用“if”语句和有限数量的参数(比如 0 到 10 之间),但是是否可以使用带有 va_args 的 IMP_im
imp.find_module()没有从压缩的鸡蛋中找到模块。 如何找到可以来自两个地方的模块:目录或压缩的鸡蛋?在我的例子中,重要的是我可以提供一个 path 参数,比如 imp.find_modu
背景 当您使用命名空间包并将代码库划分到单独的文件夹中时,pylint 无法导入文件的问题让我感到厌烦。因此,我开始深入研究 astNG 源代码,它已被确定为问题的根源(请参阅 astng 上的错误报
我正在阅读 this所以关于从绝对路径导入模块的问题。一个答案建议使用以下代码: import imp foo = imp.load_source('module.name', '/path/to/f
我正在尝试从不同的目录动态导入模块。我正在关注 this question 的回答.我在名为 foo 的目录中有一个名为 bar 的模块。主脚本将在 foo 的父目录中运行。 这是我目前在测试脚本中的
Imp 运算符 对两个表达式进行逻辑蕴涵运算。 result = expression1 Imp expression2 参数 result 任意数值变量。 expression1 任
通常,当我必须在 unix 上备份数据库时,我会这样做, exp DBUSER/DBPSW@INST file=xxx.dmp 或从转储加载 imp DBUSER/DBPSW@INST file=xx
我正在编写一些数据传输例程的脚本,并将 exp 和 imp 合并到工作流程中。这两个都有一个 FILE= 参数来指定数据文件。 有没有办法指定标准输入和标准输出?我很想做这样的事情: exp ...
我可以通过以下方式获取方法的实现: IMP imp = [self methodForSelector:@selector(foo)]; 我知道 IMP 基本上是一个函数指针。 然后我可以得到指向的代
我是一名优秀的程序员,十分优秀!