NSDate内存问题(再次)

时间:2010-04-26 08:39:12

标签: objective-c memory-management nsdate dealloc

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

保留的NSDate对象在突然之前工作正常似乎正在解除分配,当NSMutableString尝试附加它的描述(现在为'nil')时导致崩溃。

Build& analyze不会报告任何潜在的问题。

简化后,代码如下所示:

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对象会(或似乎是)释放自己?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

未经测试。但通过改变不会更简单:

[stringy appendString:[aDate description]];

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

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

答案 2 :(得分:0)

我猜你有一个drawRect:方法的事实意味着你是子类化NSView或者UIView。在任何情况下都没有向他们发送init消息。它们始终使用initWithFrame初始化:或initWithCoder :( initWithCoder:用于实例化nib文件中的视图)。你需要覆盖这两种方法,或者 - 因为你只有一个aDate的全局实例 - 你应该实现+ initialize

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