关于 block 会不会被自动 copy 的实验和猜想

今天群里不知怎么说起了 block 在栈上还是在堆上的问题。好像之前在哪里看到过,现在 block 的属性已经不用写 copy 关键字,就会自动 copy。于是做了几个实验,想看看什么情况下会自动 copy,什么情况下不会~

实验

代码如下:

TestClass.h

main

实验结果:

分析

  • 作为变量:
    • 一个 block 刚声明的时候是在栈上
    • 赋值给一个普通变量之后就会被 copy 到堆上
    • 赋值给一个 weak 变量不会被 copy
  • 作为属性:
    • 用 strong 和 copy 修饰的属性会被 copy
    • 用 weak 和 assign 修饰的属性不会被 copy
  • 函数传参:
    • 作为参数传入函数不会被 copy
    • 作为函数的返回值会被 copy

猜测

看着以上结论,感觉可以做出一个猜测:就是 block 被 retain 的时候就会自动被 copy,包括 autoRelease~ 这样就能解释为啥函数的参数不会被 copy,返回值就会被 copy。是不是很有道理呢 =w=

感谢诸位大神对本次实验的支持~

1 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部