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