
_name 是 Person里NSString的成员变量
然后他 property NSString 传 retain
他是写错了吧?。。。。
1
loveuqian 2015 年 4 月 23 日
国内都教OC了?
|
6
df4VW 2015 年 4 月 23 日
虚拟机。。机智
|
7
LINAICAI 2015 年 4 月 23 日
...你到底吐槽嘛?没看懂
|
8
lisonfan OP @huoshanhui NSString的成员变量也需要释放?不是NSObject对象才需要释放吗?
|
9
lion9527 2015 年 4 月 23 日
错是没错,不过OC2.0这种写法太啰嗦了。
还有这个年代了应该直接从ARC开始。 |
13
chchwy 2015 年 4 月 23 日
|
14
chchwy 2015 年 4 月 23 日
https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/index.html
文件一開頭就能看見 NSString 繼承了 NSObject |
16
lisonfan OP |
18
lee0100317 2015 年 4 月 23 日
@lisonfan 你说的逻辑在mrc里面必须显示的在dealloc里面release 成员变量才会出现。
|
20
wangccddaa 2015 年 4 月 23 日 @lisonfan
1 OC 都应该从基础学起,release 和 retain 是最基本的内存管理方法,尽管现在有了ARC ,但是还是要虚心的学习啊,不明白底层的东西,注定走不了多远。 2 NSString 继承自 NSObject 所以NSString 类型的变量还是需要释放的。 3 把Person实例化,这个是在内存中分配一块地址,NSString *string 也会分配一块地址,可以打印下他们的地址出来比较下。你释放的只是person 这个对象的内存地址,这个时候string 是什么情况呢?内存地址也一块被释放了么?可是他们俩是不同的地址啊,这个时候可以在delloc函数 里打印下 string 的retainCount 看下,你要理解 delloc 函数的作用。 4 MRC 的原理只是系统自动在合适的位置加上的 retain 和 release 代码而已。 |
21
Elethom 2015 年 4 月 23 日
真無語。別上這個課了,去看 CS193P 吧。
|
22
arkilis 2015 年 4 月 23 日
一切iOS开发不说明版本都是耍流氓.
|
23
lisonfan OP @wangccddaa 首先感谢您打了这么多字回答我的疑问,我也都看完了,您在第三点最后一段提到的在dealloc打印string的retainCount,我刚刚试了一下,没有在dealloc添加name release,然后直接打印name retainCount ,打印出来的值为-1
|
24
fannheyward 2015 年 4 月 23 日 歪个楼:不要通过 retainCount 做内存判断 http://whentouseretaincount.com/
|
25
lisonfan OP |
26
wezzard 2015 年 4 月 23 日 Your tutor is right. There is a best practice in MRC and that is what your tutor shown.
|
27
ianisme 2015 年 4 月 23 日
我了个大曹 怎么又是人狗。。。
|
29
robertlyc 2015 年 4 月 23 日
快 4-5年没见到过这种写法了
|
30
ybh37 2015 年 4 月 23 日
为什么不是 swift
|
32
PG6G92lJb7qCYHRt 2015 年 4 月 23 日
enable ARC please...
|
33
finian 2015 年 4 月 23 日
|
34
popo233 2015 年 4 月 23 日
看到 tz 菊花一紧 之前接手一个项目里面的变量都是这么命名的..
|
35
ashong 2015 年 4 月 23 日
没错
|
37
chisj 2015 年 4 月 23 日 看到上面还有说直接=nil的,看来MRC懂的人也不多啊,哈哈。
|
38
sallowdish 2015 年 4 月 24 日
看到release下意识看了眼发帖时间,虽然本人也是ARC开始学的
|
39
joshua7v 2015 年 4 月 24 日
|
41
krafttuc 2015 年 4 月 24 日
ARC的情况下,编译器会自动帮你在 dealloc 里 release 掉instance variables。。。如果是manual reference counting,既然前面retain过了,析构时必然要release啊
最后,这都什么年代了,还在教早几年前的东西。 |
42
krafttuc 2015 年 4 月 24 日
补充一下,前面有同学说的 retainCount 方法的返回值是不可信的,并不能每次都真实反映对象的引用数。
|
45
nori 2015 年 4 月 24 日
@krafttuc
@lisonfan 首先如果是MRC的话,retainCount是准确的,在autorelease的情况下才不具备参考,一般是最大无符整数换成有符就是-1了,当然也有随机数的情况版本问题别太纠结。 说明下为什么是-1,主要是因为初始化Person的时候,你传进去的是`@"jack"`,这是什么,就涉及到编译器和内存堆栈的知识,不想长篇大论。明确地说,这其实是个`常量`,编译之后是会直接存储在可执行程序里的,而常量都是由系统来管理其生命周期的(autorelease),因此其retainCount才没有什么参考价值。 不过话又说回来,大部分程序员认为,了解MRC很重要。我不这样认为,我个人决定现在学习确实作用不大,已经到了可以直接ARC的年代,完全没必要为了学习而学习,只要明白其原理即可。 话说当年MRC的时候确实,比现在要多些一倍有余的代码,当然如果觉得多码几行能提高成就感那就另当别论了。 |
46
xi_lin 2015 年 4 月 29 日
MRC年代写一句alloc就接一个release在后面
还是ARC好 |
47
kobe1941 2015 年 5 月 3 日
release没问题,不过都这个时候了应该直接ARC了吧。
你贴的代码,几个文件就有两种代码风格,我也是醉了 retainCount打印的值不准确,你们老师没教你么? |