Objective c NSDate内存问题(再次)

Objective c NSDate内存问题(再次),objective-c,memory-management,nsdate,dealloc,Objective C,Memory Management,Nsdate,Dealloc,我正在开发一个图形应用程序,并试图将渲染器从OpenGL更改为Quartz2D,以使文本渲染更容易 以前工作正常的保留NSDate对象突然似乎正在释放自身,当NSMutableString试图附加其描述(现在为“nil”)时,会导致崩溃 构建和分析不会报告任何潜在问题 简化后,代码如下所示: NSDate* aDate -(id)init { aDate = [[NSDate date] retain] return self; } -(void)drawRect(CGRec

我正在开发一个图形应用程序,并试图将渲染器从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
}
我应该强调的是,实际的代码要比这复杂得多,有一个单独的线程也可以访问date对象,但是有合适的锁,在代码中执行时,不会在任何地方调用
[aDate release]

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


有人能建议我可能忽略了什么,或者为什么NSDate对象正在(或似乎正在)释放自己吗?

未测试。但如果改变一下,不是会简单得多吗:

[stringy appendString:[aDate description]];


并跳过所有未测试的NSDate保留内容。但如果改变一下,不是会简单得多吗:

[stringy appendString:[aDate description]];


并跳过所有NSDate retain内容?

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

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

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

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

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

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

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

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

感谢您的建议,但NSDate对象之一是用于参考的持久性应用程序启动时间;另外两个设置在图的左侧和右侧(取消分配并保留一个新实例,但代码还没有达到那个程度);所以我不能使用这种方法。谢谢你的建议,但是其中一个NSDate对象是用于参考的持久性应用程序启动时间;另外两个设置在图的左侧和右侧(取消分配并保留一个新实例,但代码还没有达到那个程度);所以我不能用那种方法。我应该做一个大笔记;init方法中分配/初始化的内容绝对不在drawrect方法的范围内;好像它是在类之外被调用和执行的?问题似乎不在于NSDate本身;init方法中分配/初始化的内容绝对不在drawrect方法的范围内;好像它是在类之外被调用和执行的?问题似乎不在NSDate本身。