关于objective-c内存管理的一个疑问?


请输入图片描述

如图示:不是说release调用之后对象内存就被释放了么?那为什么jack对象还能调用say方法[jack say]?

ios开发 苹果 apple objective-c

最弱D香蕉 11 years, 5 months ago

首先,在ARC时代不建议大家还手动管理引用计数

然后说这个问题,在Objective-C中代码直接控制的并不是内存本身,而是内存中这个实例的引用计数。
所以,alloc方法初始化jack后,jack的引用计数是1。调用了release方法,只是把jack这个实例的引用计数减1,变为0。
引用计数为0并不等于实例被销毁,而是标记为“该实例可以被销毁”。
如果你的代码这样写


 Person *jack = [[Person alloc] init];
[jack release];
[jack say];
[jack say];
[jack say];
[jack say];
[jack say];
[jack say];
[jack say];

就会发现jack只say了前边一两次,然后就say不出来了。
因为系统回收发现jack可以被回收,并回收这段内存是需要一点点时间的,而在这段时间内jack就say了那么一两下。

阿婆主合体吗 answered 11 years, 5 months ago

Your Answer