2010-04-26 72 views
1

我正在开发一个图形应用程序,并试图将渲染器从OpenGL更改为Quartz2D以使文本渲染更容易。NSDate内存问题(再次)

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

Build &分析不报告任何潜在的问题。

简化,代码如下所示:

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

+0

我应该做一个大注释;绝对没有在init方法中分配/初始化的东西在drawrect方法的范围内;就好像它正在课堂外被调用和执行一样?这个问题似乎与NSDate本身没有关系。 – Tobster 2010-04-26 09:40:33

回答

0

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

[stringy appendString:[aDate description]]; 

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

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

+0

感谢您的建议,但其中一个NSDate对象是用于引用的持久应用程序启动时间;另外两个设置在图的左侧和右侧(解除分配并保留一个新的实例,但代码还没有到达那么远);所以我不能使用这种方法。 – Tobster 2010-04-26 09:17:02

1

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

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

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

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