最近在预备着面试,发现了自己曾经做的一篇运用汇编调试的笔记,若有过错,有望纠正。

Swift可以用inout定义一个输入输出参数,让其可以在函数内部修正外部实参的值。其本质是Copy In Copy Out,是拷贝了实参的副本,然后在函数内对副本修正,函数结束时才对本体作出真实的修正。

那么OC也是如此吗?首先给出定论:是的,也是Copy In Copy Out.

运用指针变量作为办法参数时,办法内修正指向的地址值,查看履行办法前后该指针的变化。

调试代码如下:

【iOS】OC杂谈:指针变量作为方法参数时,是否也是Copy In Copy Out?
看得出办法外和办法内的指针是不一样的,而且履行完办法后,办法外的那个指针指向的地址值才产生变化。

按照断点一步一步往下看,会发现刚履行完setupObj:会来到movq -0x30(%rbp), %rcx的方位:

【iOS】OC杂谈:指针变量作为方法参数时,是否也是Copy In Copy Out?

  1. 【新的地址值】rcx -> rsi -> objc_storeStrong -> rbx0x00007ffee71cbfe0存的值:0x0000000000000000
  2. 【原指针的值】rdx -> rdi -> objc_storeStrong -> r150x00007ffee71cbfe8这个地址)
  3. 赋值新地址】rbx -> r15(完成将0x00007ffee71cbfe8指向0x0000000000000000的操作)

【iOS】OC杂谈:指针变量作为方法参数时,是否也是Copy In Copy Out?
【iOS】OC杂谈:指针变量作为方法参数时,是否也是Copy In Copy Out?

确实是在办法结束时才对原指针指向的地址值作出修正,也就是说,类似inout一样是 Copy In Copy Out.

再次验证一下:

【iOS】OC杂谈:指针变量作为方法参数时,是否也是Copy In Copy Out?
【iOS】OC杂谈:指针变量作为方法参数时,是否也是Copy In Copy Out?

也是履行完办法后本体才会产生改动,所以办法内的指针确实是副本。

  • PS:第一次修正特点值本体也一起改动是因为此时并没有修正指针指向的地址值。

留意

通过办法修正指针指向的地址值,是在办法结束时才会对指针真实的赋值!所以在平时开发中,尤其是多线程使命,如果有如上对指针的操作需要留意一下!