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 · Apr 23, 2015 · 8299 views
    This topic created in 4221 days ago, the information mentioned may be changed or developed.

    Alt V2EX

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

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


    Person.h:


    Person.m:


    Dog.h:


    Dog.m:


    执行结果:
    wezzard
    wezzard
    Apr 23, 2015❤️1
    26
    Your tutor is right. There is a best practice in MRC and that is what your tutor shown.
    ianisme
    ianisme
    Apr 23, 2015
    27
    我了个大曹 怎么又是人狗。。。
    lisonfan
    lisonfan
    OP
    Apr 23, 2015
    28
    @ianisme 0.0教学一般不都是人狗,人学生,云云的。。
    robertlyc
    robertlyc
    Apr 23, 2015
    29
    快 4-5年没见到过这种写法了
    ybh37
    ybh37
    Apr 23, 2015
    30
    为什么不是 swift
    lisonfan
    lisonfan
    OP
    Apr 23, 2015
    31
    @ybh37 老师太差
    PG6G92lJb7qCYHRt
    PG6G92lJb7qCYHRt
    Apr 23, 2015
    32
    enable ARC please...
    popo233
    popo233
    Apr 23, 2015
    34
    看到 tz 菊花一紧 之前接手一个项目里面的变量都是这么命名的..
    ashong
    ashong
    Apr 23, 2015
    35
    没错
    lisonfan
    lisonfan
    OP
    Apr 23, 2015 via iPhone
    36
    @popo233 哈哈,命名的时候一下忘记了Weight
    chisj
    chisj
    Apr 23, 2015❤️1
    37
    看到上面还有说直接=nil的,看来MRC懂的人也不多啊,哈哈。
    sallowdish
    sallowdish
    Apr 24, 2015
    38
    看到release下意识看了眼发帖时间,虽然本人也是ARC开始学的
    joshua7v
    joshua7v
    Apr 24, 2015
    39
    虚心点 多学学总是好的... 你觉得他菜,你可以写的比他好鄙视他,前提是你写的比他好。。
    @chisj 人家是用self.name=nil MRC没有问题的
    itobeen
    itobeen
    Apr 24, 2015
    40
    @joshua7v 没释放就置空貌似有点不妥吧。。。
    krafttuc
    krafttuc
    Apr 24, 2015
    41
    ARC的情况下,编译器会自动帮你在 dealloc 里 release 掉instance variables。。。如果是manual reference counting,既然前面retain过了,析构时必然要release啊

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

    retainCount打印的值不准确,你们老师没教你么?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2432 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 103ms · UTC 05:00 · PVG 13:00 · LAX 21:00 · JFK 00:00
    ♥ Do have faith in what you're doing.