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グローバル インスタンスとしてではなく、オブジェクト フィールドとして使用してみてください。また、デフォルトの init メソッドを使用します。

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

未検証。しかし、変更することではるかに簡単になりませんか:

[stringy appendString:[aDate description]];

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

NSDate 保持のものをすべてスキップしますか?

于 2010-04-26T09:03:13.903 に答える
0

drawRect: メソッドがあるという事実は、NSView またはおそらく UIView をサブクラス化していることを意味すると思います。どちらの場合も、init メッセージが送信されることはありません。これらは常に initWithFrame: または initWithCoder: で初期化されます (initWithCoder: は、nib ファイルからビューをインスタンス化するために使用されます)。これらのメソッドの両方をオーバーライドする必要があります。または、aDate のグローバル インスタンスが 1 つしかないため、+initialize を実装する必要があります。

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