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:第一次修正特点值本体也一起改动是因为此时并没有修正指针指向的地址值。
留意
通过办法修正指针指向的地址值,是在办法结束时才会对指针真实的赋值!所以在平时开发中,尤其是多线程使命,如果有如上对指针的操作需要留意一下!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。