变成了 我们 上述的值,这一切都和猜想的差不多
于是一个基本设想就出来了:
因为栈上的地址结构和原本类的需求地址结构高度重合了,同时所有地址都能访问到对应的值。我们通过栈的默认行为生成了一个Spark对象!
为了验证,我们打印一下cls和str的指针堆栈地址
NSLog(@"cls address:%p str address:%p",&cls,&str);
2018-11-29 21:03:30.490989+0800 test[2129:122769] cls address:0x7ffeebf4fa00 str address:0x7ffeebf4fa08
我们可以看到他们之间相差也正好是8,而且正好和对象结构体定义的一模一样。所以这也正好能说明我们上述的打印结果My name is:11111为什么会发生。
注:这个存在的原因是因为函数内部变量采用的小端模式,也就是将参数地址由栈区从高地址依次向低地址分配,所以我们打印cls地址会比str要小。
由此,第一个小问题就解决了,答案是因为我们在生成堆栈参数的时候,拼凑出了Spark对象的地址数据结构格式,和真正的对象地址数据结构一样,所以self.name就是在生成cls的那一刻起内存地址就已经被赋值了。
接下来到下一个问题了ViewController 是什么时候传入的?
在这一步里我们只能把目光向cls对象生成前执行的操作来看,[super viewDidLoad];我们只执行了这一步操作,那必然是这个操作产生的结果。为了验证,我们可以更改一下调用顺序










