- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要理清思路才能理解 objc_msgSend()。请慷慨地提供详细答案。 :)
这是我对 Apple Doc 的理解。
When a message is sent to an object, the messaging function follows the object's isa pointer to the class structure where it looks up the method selector in the dispatch table. If it cant find the selector there, objc_msgSend() follows the pointer to the supperclass (HERE is confusion) and tries to climb the class hierarchy.
在这里,父类(super class)是否分配了内存并且是一个可用于该父类(super class)的指针?上面的引述是这样说的吗?
最佳答案
如果您查看 NSObject 的 ObjC-2.0 之前的声明,您会看到:
@interface NSObject <NSObject> {
Class isa;
}
类在哪里:
typedef struct objc_class *Class;
而 objc_class 是:
struct objc_class {
struct objc_class *isa;
struct objc_class *super_class;
const char *name;
long version;
long info;
long instance_size;
struct objc_ivar_list *ivars;
struct objc_method_list **methodLists;
struct objc_cache *cache;
struct objc_protocol_list *protocols;
};
因此,isa
指针——NSObject
中的第一个字段,也是每个子类中的第一个字段——是指向 objc_class< 的指针
结构。该结构的其余部分描述了该类的详细信息。 super_class
字段指向描述父类(super class)的 objc_class
结构。
当 objc_msgSend()
尝试分派(dispatch)一个方法给一个 NSMutableString
时,它首先会查看 objc_class
的方法列表描述一个 NSMutableString
实例。如果它没有找到该方法,它会查看 super_class
结构并在那里进行搜索。如果在那里找不到它,它就会在 super_class
的 super_class
中查找。
即任何给定类的 isa
指向的结构中的 super_class
指针是类层次结构中一直到 NSObject
的链表(通常)。如果 super_class
字段为空,那将是一个根类。
内存分配或多或少以类似的方式完成。实例的 instance_size
字段指定实例的大小,从而指定要分配的内存量。
或多或少。所有这些结构现在都是不透明的。正如 Richard Ross III 在评论中所说,您必须使用内省(introspection)函数来获取这些结构的内容。这允许 Apple 更改实现细节,而无需重新编译所有内容。
关于ios - objc_msgSend() 调度表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23352289/
我需要理清思路才能理解 objc_msgSend()。请慷慨地提供详细答案。 :) 这是我对 Apple Doc 的理解。 When a message is sent to an object, t
假设我在运行时得到一个对象和它的选择器之一,我打算安全地调用它,所以我定义了 #define objc_msgsend_va ((void (*)(id, SEL, ...))objc_msgsend
当我尝试在模拟器(3.1.3,Xcode 3.1.4)上启动我的应用程序时,它显示 objc_msgSend 并且应用程序没有启动。只有当我 alloc NSMUtable Array 时才会发生这种
我在我的应用程序中收到了“objc_msgSend()” fatal error 消息,这要感谢 Hamster Emporium我可以弄清楚发生了什么。 现在我找到了“问题”和“解决方案”,但我不明
我的 iOS 应用程序有一些来自 bugsense 的崩溃报告,但我无法重现,因此无法调试。它一天发生 200 多次,所以我想这很严重。 我读过一些关于 NSZombie 的内容,但我无法重现崩溃,所
当我在应用程序中随机单击按钮时,它会变成这样,没有任何错误或任何异常请给我建议以及如何克服此类错误 提前致谢 最佳答案 为代码中的所有异常设置断点,我们无法使用该信息做任何事情。 如果这没有帮助,只需
在我的项目中,我在右上角添加了一个关闭按钮,如下所示: int closeBtnOffset = 10; UIImage* closeBtnImg = [UIImage imageNamed:@"po
我正在使用 dtrace 打印代码中的所有 objc_msgSend。到目前为止,我可以看到选择器的名称,但无法获得正确的类名。 这是我的 dtrace 脚本: #!/usr/sbin/dtrace
我正在编写一个 objc 桥,我发现了一种使用 objc_msgSend 调用 objc 方法的非常有效的方法。 基本上,代码能够生成一个宏,该宏传递给 objc_msgSend 从 NSArray
我一直在分析我的回合制游戏应用程序,我遇到了一个有趣的(也许)问题。根据下图,objc_msgSend 似乎占用了我的应用程序将近一分钟的运行时间。这是什么,它是否是某些代码编写不当的标志?谢谢! 最
当我有返回一些联合的方法时,我有一个与 objc_msgSend 运行时调用相关的问题。 我正在通过 libffi 调用 objc_msgSend 函数,如果我有小于 16B 的联合,一切都很好,但如
我正在测试我的应用程序,非常努力地插入它,但我让它崩溃了(黑屏,图像无法保存,返回到 springboard)。但是,我没有在控制台中记录任何崩溃报告。当我使用探查器进行测试时,我得到的只是一条消息,
我已经为 iphone 启动了一个基于 2d 图 block 的游戏,我将直接跳转到我的类(class)和问题。我现在总共有 2 个类 Tile 、 Table 和 Base 主类瓦 `@interf
我正在尝试使用 objc_msgSend动态调用某个方法的方法。 假设我想从 A 类调用 B 类中的某个方法,而 B 类中有两个方法,例如: - (void) instanceTestWithStr1
我很惊讶在 stackoverflow 上搜索 j__objc_msgSend 返回 0 个结果,Google 似乎也不太了解它。根据它的 disassembly , j__objc_msgSend
我正在尝试追踪一个错误,我有一个看起来像这样的崩溃日志: 0 libobjc.A.dylib objc_msgSend + 15 1 CoreFoundation __CFRUN
我在 Crashlytics 中遇到如下所示的崩溃。 我无法理解这是应用程序中的什么形式。不幸的是,我自己从未能够生成此崩溃,但它正在发生。 只有一个对应用名称的引用,没有任何内容可以表明它来自应用中
我正在尝试确定 Apple 在 NSWorkspace 上公开的方法在内部如何工作,以便尝试解决该方法的不幸副作用(它写入磁盘,每次调用它)。我可以将 lldb 附加到我的可执行文件并在调用该方法时设
我最近遇到了一个问题,在 Google 上没有可用的解决方案。我想将应用程序的 Objective-C 消息记录到控制台或文件中。我没有编写应用程序,所以我没有源代码来重新编译并包含日志记录。我有一个
当 NSAutoreleasePool 耗尽时,我发生了崩溃。据推测,该池正试图释放一个已被另一段代码过早释放的对象。我遇到的崩溃发生在 objc_msgSend 中,因为它正在尝试向不再存在的对象发
我是一名优秀的程序员,十分优秀!