1

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

4

3 回答 3

1

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

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame])
       aDate = [[NSDate date] retain]
    }
    return self;
}
于 2010-04-26T11:13:02.063 回答
0

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

+(void) initialize
{
    if (aDate == nil)
    {
        aDate = [[NSDate date] retain];
    }
}
于 2010-04-26T12:35:52.687 回答
0

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

[stringy appendString:[aDate description]];

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

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

于 2010-04-26T09:03:13.903 回答