我们老师教 OC,今天说内存管理,他把 NSString 的成员变量在 dealloc 里释放了 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
lisonfan
V2EX    iDev

我们老师教 OC,今天说内存管理,他把 NSString 的成员变量在 dealloc 里释放了

  •  
  •   lisonfan 2015-04-23 09:16:19 +08:00 7383 次点击
    这是一个创建于 3836 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Alt V2EX

    _name 是 Person里NSString的成员变量
    然后他 property NSString 传 retain
    他是写错了吧?。。。。

    47 条回复    2015-05-03 19:04:04 +08:00
    loveuqian
        1
    loveuqian  
       2015-04-23 09:25:21 +08:00
    国内都教OC了?
    lisonfan
        2
    lisonfan  
    OP
       2015-04-23 09:25:55 +08:00 via iPhone
    @loveuqian 专科
    lisonfan
        3
    lisonfan  
    OP
       2015-04-23 09:27:29 +08:00 via iPhone
    @loveuqian 拿虚拟机教……我一直在怀疑这老师的水平……
    anerevol
        4
    anerevol  
       2015-04-23 09:37:43 +08:00
    一直用arc 看到release好不习惯。
    retain的release没问题啊。
    更好的做法是 self.name = nil吧
    huoshanhui
        5
    huoshanhui  
       2015-04-23 09:39:41 +08:00
    @lisonfan 没写错。还在交 MRC 啊。
    df4VW
        6
    df4VW  
       2015-04-23 09:39:41 +08:00
    虚拟机。。机智
    LINAICAI
        7
    LINAICAI  
       2015-04-23 09:42:18 +08:00
    ...你到底吐槽嘛?没看懂
    lisonfan
        8
    lisonfan  
    OP
       2015-04-23 09:46:37 +08:00 via iPhone
    @huoshanhui NSString的成员变量也需要释放?不是NSObject对象才需要释放吗?
    lion9527
        9
    lion9527  
       2015-04-23 09:47:12 +08:00
    错是没错,不过OC2.0这种写法太嗦了。
    还有这个年代了应该直接从ARC开始。
    lion9527
        10
    lion9527  
       2015-04-23 09:48:55 +08:00
    @lisonfan 有retain的就需要release。OC基础教程里有说
    Vimiumist
        11
    Vimiumist  
       2015-04-23 09:54:03 +08:00
    @lisonfan 而且NSString也是NSObject
    lisonfan
        12
    lisonfan  
    OP
       2015-04-23 09:57:58 +08:00 via iPhone
    @Vimiumist
    @lion9527
    那property nsstring 传copy 还是 retain?
    chchwy
        13
    chchwy  
       2015-04-23 10:01:19 +08:00
    chchwy
        14
    chchwy  
       2015-04-23 10:02:07 +08:00
    Vimiumist
        15
    Vimiumist  
       2015-04-23 10:02:49 +08:00
    @lisonfan 如果我没有理解错你的问题的话,传copy还是retain取决于你声明property的时候是copy还是retain
    lisonfan
        16
    lisonfan  
    OP
       2015-04-23 10:04:53 +08:00 via iPhone
    @Vimiumist
    @lion9527
    我把Person实例化,然后把实例化对象release,Person里的成员变量不都被release了吗?
    sangmong
        17
    sangmong  
       2015-04-23 10:05:28 +08:00
    @loveuqian 国内各种培训iOS的,遍地都是
    lee0100317
        18
    lee0100317  
       2015-04-23 10:14:17 +08:00
    @lisonfan 你说的逻辑在mrc里面必须显示的在dealloc里面release 成员变量才会出现。
    Vimiumist
        19
    Vimiumist  
       2015-04-23 10:22:38 +08:00
    @lisonfan 从你问的问题来看我感觉你太多基础的东西还不了解,建议你找本书看看,做做练习题,否则知道了这个问题的答案你也未必能理解原因
    wangccddaa
        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 代码而已。
    Elethom
        21
    Elethom  
       2015-04-23 10:42:16 +08:00
    真。上了,去看 CS193P 吧。
    arkilis
        22
    arkilis  
       2015-04-23 10:49:54 +08:00
    一切iOS开发不说明版本都是耍流氓.
    lisonfan
        23
    lisonfan  
    OP
       2015-04-23 11:00:50 +08:00 via iPhone
    @wangccddaa 首先感谢您打了这么多字回答我的疑问,我也都看完了,您在第三点最后一段提到的在dealloc打印string的retainCount,我刚刚试了一下,没有在dealloc添加name release,然后直接打印name retainCount ,打印出来的值为-1
    fannheyward
        24
    fannheyward  
       2015-04-23 11:04:25 +08:00   1
    歪个楼:不要通过 retainCount 做内存判断 http://whentouseretaincount.com/
    lisonfan
        25
    lisonfan  
    OP
       2015-04-23 11:05:37 +08:00
    @wangccddaa 给您看看代码吧。
    main.m:


    Person.h:


    Person.m:


    Dog.h:


    Dog.m:


    执行结果:
    wezzard
        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.
    ianisme
        27
    ianisme  
       2015-04-23 11:13:51 +08:00
    我了个大曹 怎么又是人狗。。。
    lisonfan
        28
    lisonfan  
    OP
       2015-04-23 11:18:22 +08:00
    @ianisme 0.0教学一般不都是人狗,人学生,云云的。。
    robertlyc
        29
    robertlyc  
       2015-04-23 14:39:07 +08:00
    快 4-5年没见到过这种写法了
    ybh37
        30
    ybh37  
       2015-04-23 14:45:08 +08:00
    为什么不是 swift
    lisonfan
        31
    lisonfan  
    OP
       2015-04-23 14:45:59 +08:00
    @ybh37 老师太差
    PG6G92lJb7qCYHRt
        32
    PG6G92lJb7qCYHRt  
       2015-04-23 14:51:15 +08:00
    enable ARC please...
    finian
        33
    finian  
       2015-04-23 15:25:02 +08:00
    popo233
        34
    popo233  
       2015-04-23 17:54:26 +08:00
    看到 tz 菊花一紧 之前接手一个项目里面的变量都是这么命名的..
    ashong
        35
    ashong  
       2015-04-23 18:26:59 +08:00
    没错
    lisonfan
        36
    lisonfan  
    OP
       2015-04-23 18:50:49 +08:00 via iPhone
    @popo233 哈哈,命名的时候一下忘记了Weight
    chisj
        37
    chisj  
       2015-04-23 19:58:54 +08:00   1
    看到上面还有说直接=nil的,看来MRC懂的人也不多啊,哈哈。
    sallowdish
        38
    sallowdish  
       2015-04-24 07:28:44 +08:00
    看到release下意识看了眼发帖时间,虽然本人也是ARC开始学的
    joshua7v
        39
    joshua7v  
       2015-04-24 07:57:20 +08:00
    虚心点 多学学总是好的... 你觉得他菜,你可以写的比他好鄙视他,前提是你写的比他好。。
    @chisj 人家是用self.name=nil MRC没有问题的
    itobeen
        40
    itobeen  
       2015-04-24 08:28:26 +08:00
    @joshua7v 没释放就置空貌似有点不妥吧。。。
    krafttuc
        41
    krafttuc  
       2015-04-24 12:18:27 +08:00
    ARC的情况下,编译器会自动帮你在 dealloc 里 release 掉instance variables。。。如果是manual reference counting,既然前面retain过了,析构时必然要release啊

    最后,这都什么年代了,还在教早几年前的东西。
    krafttuc
        42
    krafttuc  
       2015-04-24 12:22:58 +08:00
    补充一下,前面有同学说的 retainCount 方法的返回值是不可信的,并不能每次都真实反映对象的引用数。
    lisonfan
        43
    lisonfan  
    OP
       2015-04-24 12:39:20 +08:00
    @krafttuc 这老师以前是教Java的,而且我们学校我这一届是第一届苹果开发专业的...我估计这老师也是寒假的时候自己学的OC
    lisonfan
        44
    lisonfan  
    OP
       2015-04-24 12:46:30 +08:00
    @krafttuc 我们老师的教学环境是 OS 10.8.5 X Xcode 5.X
    nori
        45
    nori  
       2015-04-24 22:00:33 +08:00
    @krafttuc
    @lisonfan
    首先如果是MRC的话,retainCount是准确的,在autorelease的情况下才不具备参考,一般是最大无符整数换成有符就是-1了,当然也有随机数的情况版本问题别太纠结。
    说明下为什么是-1,主要是因为初始化Person的时候,你传进去的是`@"jack"`,这是什么,就涉及到编译器和内存堆栈的知识,不想长篇大论。明确地说,这其实是个`常量`,编译之后是会直接存储在可执行程序里的,而常量都是由系统来管理其生命周期的(autorelease),因此其retainCount才没有什么参考价值。
    不过话又说回来,大部分程序员认为,了解MRC很重要。我不这样认为,我个人决定现在学习确实作用不大,已经到了可以直接ARC的年代,完全没必要为了学习而学习,只要明白其原理即可。
    话说当年MRC的时候确实,比现在要多些一倍有余的代码,当然如果觉得多码几行能提高成就感那就另当别论了。
    xi_lin
        46
    xi_lin  
       2015-04-29 21:18:56 +08:00
    MRC年代写一句alloc就接一个release在后面
    还是ARC好
    kobe1941
        47
    kobe1941  
       2015-05-03 19:04:04 +08:00
    release没问题,不过都这个时候了应该直接ARC了吧。
    你贴的代码,几个文件就有两种代码风格,我也是醉了

    retainCount打印的值不准确,你们老师没教你么?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3186 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 10:48 PVG 18:48 LAX 03:48 JFK 06:48
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86