学习的疑问

1、内存管理:dealloc之后还能打印出retainCount = 1

答:输出时对象的内存已经被回收。
向一个已经被回收的对象发送retainCount消息,输出结果应该是不确定的,如果该对象所占内存被复用了,有可能会造成程序异常崩溃。
为什么这个不确定的值是1而不是0?因为最后一次执行release时,系统知道马上要回收内存,就没必要将retainCount减1了,因为不管减不减1,该对象肯定会被回收。
不将这个值从1变成0,可以减少一次内存操作,加速对象的回收。
结论:不要向已经释放的对象发送消息。

new:那输出时,对象内存已经被回收,怎么还能打印出dog的name?

2、内存管理:自动释放池嵌套

-->创建先pool1dog1 autoRelease,后pool2dog2 autoRelease释放先pool1,后pool2按照autoRelease是向上找到pool加入dog1加入pool1dog2加入pool2按照释放pool时释放池内对象,先释放dog1,后释放dog2

-->运行打印符合预期效果,但是pool2池释放报内存泄露错误。

3、使用类名方法创建对象,引用计数为2
clipboard.png

答:

  1. 根据StackOverflow上的回答,这是因为NSArray是一个不可变对象,而由[NSArray array]或者[[NSArray alloc] init]生成的都是不可变的空数组,所以苹果默认所有不可变空数组的引用都指向一个唯一实例以进行优化,所以在[NSArray array]之前,这个实例的retainCount就是1了。在代码中不论是[NSArray array]或者[[NSArray alloc] init]都会增加此空数组实例的引用计数。

以下代码可以比较直观的体现这一点,与a无关的[NSArray array]语句增加了a的引用计数。

NSArray *a = [[NSArray alloc] init];
[NSArray array];
[NSArray array];
NSLog("retainCount = %ld", a.retainCount);//输出结果为4

如果不开ARC的情况下,内存管理只要遵循Apple文档中的基本内存管理规则中的四条“黄金律”即可。

原文地址:https://www.cnblogs.com/LiuLady12138/p/4472288.html