在OC中,怎么样理解\"引用计数\"的实质

在OC中,怎么样理解\"引用计数\"的实质


■网友
当一个对象被世界遗忘,且没有任何迹象表明会被重新记起的时候,那他就等同于不存在了,那它就该被自动销毁。
■网友
第一个class1被release后还是1具体原因不是很清楚,但是它在release后的确是调用了dealloc方法,按理说应该是被释放了;关于NSString的:可以打印NSString的class,可以发现是_NSCFConstantString,它其实是一个字符串常量,是没有retainCount(引用计数)的,如果打印retaincount的话应该是-1,而NSMutableString的class是_NSCFString,是有引用计数的;关于NSArray的,NSArray是不会像这样初始化的,NSArray本身就是不可变数组,这样初始化里面不就没有数据了吗,如果改为用initWithObject:它的retaincount就正常了。-------------------------------------------------------------------------------------补充第一个问题:刚看了一下《Effective Objective-C 2.0》,里面也提及到retainCount,大致意思就是不推荐使用retainCount方法,因为它对程序本身没有作用,retainCount可能永远不返回0,有时系统会优化对象的释放行为,在保留计数还是1的时候(就是上例class1进行release操作)就把它回收了。只有在系统不打算这么优化的时候,retainCount才会递减至0。因此retainCount可能永远都不会完全归零。
■网友
1. retain值 = 索引计数(Reference Cointing)NSArray对象会retain(retain值加一)任何数组中的对象。当NSArray被dealloc的时候,所有数组中的对象会被执行一次释放(retain值减一)。不仅仅是NSArray, 任何收集类(Collection Class)都会执行类似的操作。包括NSDictionary, UINavigationController。Alloc/init建立的对象,引用计数为1。(以下统一说成引用计数好了)引用计数标记的是具体的对象,释放也是针对对象的引用计数。2. 关于NSString(字符串)的retainCount值,打印为%ld为-1 , %lu为2的64次方-1(一个无穷大的数)3.关于最后一个问题,为什么明明引用计数为0,也走了dealloc方法,打印retainCount还是1,我给你举个例子:有一天你和女朋友去开房,这时候你需要快捷酒店开一个房间,进入房间的时候,灯肯定还没有打开对吧, 你插好房卡打开灯,然后啪啪啪,拔走房卡,灯灭了,完事出来,退房。这个过程就是retainCount值变化的过程,你把灯想象成那个引用计数(原谅我举得这个不恰当的例子吧。。。)你需要用它时打开+1,完事走了关了-1,但是灯是不是还在那里,你总不能说我开个房间完事就把灯给爆了吧。所以它还在那里,只不过没有通上电,就当不存在了。。。(捂脸,我编不下去了。。)先这样吧。。。
■网友
我也遇到了这样的问题,原来是重写的dealloc方法没有加,加这句代码之后,执行完dealloc再调用retainCount方法会报错。我现在的问题是我新建一个对象(MRC),然后把指针赋值为nil,retainCount为0,但不执行dealloc方法,咋回事。
■网友
【在OC中,怎么样理解\"引用计数\"的实质】 解释一下第一个 1. 当一个对象的引用计数为1的时候,再被release 那么这个对象所在的内存就会被标记为回收(如同硬盘的格式化标记),但并不会执行 retaincount --; 因为已经是被标记的无用内存了没必要再操作,就少了一次内存操作,如果这是你调用 retaincount 当这个内存被重用之前是可以取值,但是如果已经被重用。那你就死了。

■网友
找本OC的大部头瞅瞅,都讲的可明白了。
■网友
用arc
■网友
引用计数为0的时候,在控制台打印还是1。。。我做过实验试过的,也就是说,打印不出来为0的引用计数。。。。应该是这样的。再说这些了解下就好了吧,现在都是自动管理内存的。


推荐阅读