Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
了解Objective-C运行时_Objective C_Objective C Runtime - Fatal编程技术网

了解Objective-C运行时

了解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

我已经读过Objective-C运行时是如何工作的,所以如果我误解了什么,请发表评论

假设我有一个叫做Person的类。该类可能有方法getSex,也可能没有方法getSex

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指针将是有效的-我们讨论的是接口中声明的属性,这是特定于实现的。