Swift
可以用inout
定义一个输入输出参数,让其可以在函数内部修正外部实参的值。其本质是Copy In Copy Out
,是拷贝了实参的副本,然后在函数内对副本修正,函数结束时才对本体作出真实的修正。
那么OC也是如此吗?首先给出定论:是的,也是Copy In Copy Out.
运用指针变量作为办法参数时,办法内修正指向的地址值,查看履行办法前后该指针的变化。
调试代码如下: 看得出办法外和办法内的指针是不一样的,而且履行完办法后,办法外的那个指针指向的地址值才产生变化。
按照断点一步一步往下看,会发现刚履行完setupObj:
会来到movq -0x30(%rbp), %rcx
的方位:
- 【新的地址值】
rcx
->rsi
->objc_storeStrong
->rbx
(0x00007ffee71cbfe0
存的值:0x0000000000000000
) - 【原指针的值】
rdx
->rdi
->objc_storeStrong
->r15
(0x00007ffee71cbfe8
这个地址) - 【赋值新地址】
rbx
->r15
(完成将0x00007ffee71cbfe8
指向0x0000000000000000
的操作)
确实是在办法结束时才对原指针指向的地址值作出修正,也就是说,类似inout
一样是 Copy In Copy Out.
再次验证一下:
也是履行完办法后本体才会产生改动,所以办法内的指针确实是副本。
- PS:第一次修正特点值本体也一起改动是因为此时并没有修正指针指向的地址值。
留意
通过办法修正指针指向的地址值,是在办法结束时才会对指针真实的赋值!所以在平时开发中,尤其是多线程使命,如果有如上对指针的操作需要留意一下!