【问题标题】:Cocoa-Touch: NSDateComponents crashes on releasing a fresh instanceCocoa-Touch:NSDateComponents 在释放新实例时崩溃
【发布时间】:2009-10-08 16:16:42
【问题描述】:

我有:

NSDate *d = [[NSDate alloc] init];
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents *dc = [calendar components:unitFlags fromDate:d];
// doing something with dc.day, dc.month, dc.year
[dc release];
[d release];

我试过删除“做某事..部分”,只是做了一个获取和释放,它仍然崩溃。 如果我只是注释掉 [dc release] 部分,一切正常。

我是 Obj-C 的新手。知道为什么会崩溃吗? 我做错了吗?

【问题讨论】:

    标签: iphone objective-c cocoa iphone-sdk-3.1


    【解决方案1】:

    你不应该发布dc。它不是来自 alloc、new 或副本。

    刷一下Cocoa Memory Management Rules

    【讨论】:

    • 你是对的,它在页面上说。但是我得到了一个指向那个新对象(由日历创建)的指针,并且日历不再对它做任何事情(它不知道我什么时候用完它)。所以日历不知道什么时候发布,什么时候发布?
    • 日历返回给您的实例将被自动释放。它将在下一个自动释放池释放/耗尽时间(通常是事件循环结束)释放。如果你想在这个方法的范围之外引用它,你应该保留它。
    • 我想你也是对的,但我读到由于性能原因,自动释放功能在 iPhone 上不可用。我得读一读。非常感谢,这对我有帮助:)
    • 您可能正在考虑垃圾收集,目前手机上还没有。请注意,垃圾收集和自动释放池是两个不同的概念。
    • 知道如何处理内存管理是 Cocoa 的基础。请不要尝试继续您在某个地方听说过的事情。阅读正确的指南。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多