了解Objective-C运行时
我已经读过Objective-C运行时是如何工作的,所以如果我误解了什么,请发表评论 假设我有一个叫做Person的类。该类可能有方法getSex,也可能没有方法getSex了解Objective-C运行时,objective-c,objective-c-runtime,Objective C,Objective C Runtime,我已经读过Objective-C运行时是如何工作的,所以如果我误解了什么,请发表评论 假设我有一个叫做Person的类。该类可能有方法getSex,也可能没有方法getSex Person *p = [[Person alloc]init]; 这里为Person实例分配内存(同时创建指向类Person的isa),init用于初始化Person ivar [p getSex]; 这里对Person类调用objc_msgSend(Person,@selector(getSex))。 如果Pers
Person *p = [[Person alloc]init];
这里为Person实例分配内存(同时创建指向类Person的isa),init用于初始化Person ivar
[p getSex];
这里对Person类调用objc_msgSend(Person,@selector(getSex))。
如果Person类没有这样的方法,运行时会在Person根类中查找该方法,以此类推。当找到该方法时,会调用IMP,IMP是指向方法块代码的指针。然后执行该方法
正确吗?是的,一切都是正确的,除了init的行为可能初始化或可能不初始化其所有成员变量,以便访问器返回有效结果,尽管有理由猜测它初始化属性,除非另有说明。有一点不正确 该调用实际上是以下三个调用之一:
objc_msgSend(p, @selector(getSex))
objc_msgSend_fpret(p, @selector(getSex))
objc_msgSend_stret(p, @selector(getSex))
这里的一个区别是,第一个参数是对象,而不是类
另外,由于您没有共享getSex
方法返回的内容,因此我们无法知道它是否是fpret
/stretc
版本之一。如果该方法返回双精度(在某些平台上),则将使用fpret
版本。如果该方法返回结构值(在某些平台上),然后将使用stret
版本。所有其他版本将使用标准版本。所有这些都以许多不同的方式依赖于平台
正如其他人所说,分配将创建一个对象,其中所有实例变量都设置为
0
/NULL
,并且还有一个有效的isa
指针。初始化方法可能会也可能不会用有意义的内容更新实例变量。它们在任何情况下都会有有效但不一定有用的内容——它们已经设置好了通过alloc
将其设置为0。是的,但定义良好并不一定意味着有效。例如,为Person实例分配的内存只保存指向Person类的isa指针,对吗?isa指针将是有效的-我们讨论的是接口中声明的属性,这是特定于实现的。