我正在开发一个图形应用程序,我正在尝试将渲染器从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对象会(或似乎是)释放自己?
答案 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];
}
}