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 · 6920 次点击
    这是一个创建于 3537 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 老师太差
    exherb
        32
    exherb  
       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   ·   实用小工具   ·   1942 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 00:51 · PVG 08:51 · LAX 16:51 · JFK 19:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.