【问题标题】:Releasing Objects, Am I understanding it correctly?释放对象,我理解正确吗?
【发布时间】:2011-06-15 16:43:35
【问题描述】:

我是对象 C 的新手,但我认为我的内存管理想法至少从根本上是正确的。我有这个简单的方法:

-(int)weekIdFromDate:(NSDate *)inDate {

    NSCalendar *currentCal = [NSCalendar currentCalendar];
    NSDateComponents *component = [currentCal components:NSWeekCalendarUnit fromDate:inDate];
    int week = [component week];

    //I don't understand why this fails, it seems correct to release these objects now that they
    // are no longer needed
    [currentCal release];
    [component release];

    return week;
}

该方法存在于我的根视图控制器中,但警告位于“main”函数中。我用一个僵尸来定位“BAD_ACCESS ...”的原因。如果我将这些评论发布到版本中,一切都可以正常工作。

【问题讨论】:

    标签: iphone objective-c ios xcode4


    【解决方案1】:

    您正在释放不属于您的对象。

    您用于获取currentCalcomponent 的方法返回autoreleased 对象,这不是您对release 的责任。

    您只对通过new alloccopy 获得的对象或您发送retain 消息的对象调用release。 (记住助记符 NARC)。

    Memory Management Guide中都有解释

    【讨论】:

    • 从技术上讲,它是包含这些术语的方法(即像mutableCopyallocWithZone: 这样的方法也会返回您需要释放的对象)。
    • 是的 - 但我试图保持简单,并希望文档能提供很多细节:)
    • 完全隔开。现在很清楚了。谢谢你们,两位,为那一课。
    【解决方案2】:

    你只能释放你拥有的对象,要么自己分配它们[[NSString alloc] init],要么保留已经存在的对象[thisVar retain]。释放它们只是告诉程序您不再需要它们。如果您自己分配它们并且没有其他任何东西具有任何所有权,它们将从内存中释放,但如果其他东西仍然具有所有权并且没有调用释放方法,它们将不会被释放,直到该对象调用释放。

    但是,对于您的程序,您依赖于自动释放。当您创建对象时,您不会分配或保留它们,因此当它们的 NSAutoreleasePool 耗尽时它们将丢失(在方法结束时,除非您在另一个线程中),您不必担心它们更多。

    基本上,由于您没有分配或保留它们,因此您不必释放它们。

    希望这会有所帮助。

    【讨论】:

    • 从技术上讲,主自动释放池在事件循环的顶部被耗尽,这可能意味着在池耗尽之前调用了几个方法。本地自动释放池在耗尽时也会被耗尽,这些也可以包含多条消息。
    猜你喜欢
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多