一个内存问题

2014-03-25 17:08:25 +08:00
 cielpy
代码:
NSObject *obj = [[NSObject alloc] init];
NSLog(@"retain count 1:%d",obj.retainCount);
[obj retain];
NSLog(@"retain count 2:%d",obj.retainCount);
[obj release];
NSLog(@"retain count 3:%d",obj.retainCount);
[obj release];
NSLog(@"retain count 4:%d",obj.retainCount);
[obj release];
NSLog(@"retain count 5:%d",obj.retainCount);
[obj release];
NSLog(@"retain count 6:%d",obj.retainCount);

程序会crash到第三个release,但是retain count 4:打印出来是1,为什么?
2887 次点击
所在节点    iDev
4 条回复
fangzhzh
2014-03-25 17:39:55 +08:00
此测试文件是arc的么?

我记得文档上说的retainCount不可信的.

好了, 给楼主搜出来了一个 http://www.whentouseretaincount.com/ 答案是never.

一般来说,这个retaincount, 流程最好在脑子里跑清楚
cielpy
2014-03-25 17:50:43 +08:00
@fangzhzh 手动release,非arc的,那就是这个retaincount只是一个概念咯?一个对象的retainCount是不可信的。
hoogle
2014-03-25 19:52:16 +08:00
这个输出无问题。。 第二个release之后,obj持有的对象被释放。。 所以第三个release会crash。 但是, 这个时候obj仍然指向之前的内存(成为野指针), 根据程序的运行状况,obj.retainCount,可能是任何内容。。 正确的做法需要在release之后,加 obj = nil。 而在ARC下,不持有任何对象的指针会自动置为nil。
cielpy
2014-03-25 21:46:37 +08:00
@hoogle 就是要注意obj.retainCount为1时,再release,再obj = nil.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/105848

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX