【问题标题】:NSDate memory issue (again)NSDate 内存问题(再次)
【发布时间】:2010-04-26 08:39:11
【问题描述】:

我正在开发一个图形应用程序,并试图将渲染器从 OpenGL 更改为 Quartz2D,以使文本渲染更容易。

之前工作正常的保留 NSDate 对象突然似乎正在释放自身,当 NSMutableString 尝试附加它的描述(现在为“nil”)时导致崩溃。

构建和分析不会报告任何潜在问题。

简化,代码如下:

NSDate* aDate

-(id)init
{
    aDate = [[NSDate date] retain]
    return self;
}

-(void)drawRect(CGRect)rect
{
    NSMutableString* stringy = [[NSMutableString alloc] init];

    //aDate is now deallocated and pointing at 0x0?
    [stringy appendString:[aDate description]]; //Crash
}

我要强调的是,实际代码比这复杂得多,有一个单独的线程也可以访问日期对象,但是适当的锁已经到位,并且在单步执行代码时[aDate release] 不会在任何地方被调用。

使用[[NSDate alloc] init] 具有相同的效果。 我还应该补充一点,init 是第一个被调用的函数。

谁能提出一些我可能忽略的事情,或者为什么 NSDate 对象正在(或似乎正在)释放自己?

【问题讨论】:

  • 我应该做一个重要的说明;绝对没有在 init 方法中分配/初始化的内容在 drawrect 方法的范围内;好像它在课堂外以某种方式被调用和执行?问题似乎不在于 NSDate 本身。

标签: objective-c memory-management nsdate dealloc


【解决方案1】:

尝试使用aDate 作为对象字段而不是全局实例。 也使用默认的 init 方法。

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame])
       aDate = [[NSDate date] retain]
    }
    return self;
}

【讨论】:

    【解决方案2】:

    未测试。但是通过改变会不会简单很多:

    [stringy appendString:[aDate description]];
    

    [stringy appendString:[[NSDate date] description]];
    

    跳过所有那些 NSDate 保留的东西?

    【讨论】:

    • 感谢您的建议,但是其中一个 NSDate 对象是用于参考的持久应用程序启动时间;另外两个设置在图表的左侧和右侧(释放并保留一个新实例,但代码还没有达到那么远);所以我不能用那个方法。
    【解决方案3】:

    我猜你有一个drawRect: 方法意味着你是NSView 或者UIView 的子类。在这两种情况下,初始化消息都不会发送给他们。它们总是用 initWithFrame: 或 initWithCoder: 初始化(initWithCoder: 用于从 nib 文件实例化视图)。你需要重写这两个方法,或者 - 因为你只有一个 aDate 的全局实例 - 你应该实现 +initialize

    +(void) initialize
    {
        if (aDate == nil)
        {
            aDate = [[NSDate date] retain];
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-12
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多