0

Quartz Composer のカスタム パッチの仕上げに取り組んでいます。現時点では、パッチからほとんどすべてが削除されており、ivar である NSDictionary 値を NSLog にしようとするとクラッシュし、BAD ACCESS が表示され、最後に割り当てたときに完全に機能しました。

私のコードは次のようになります。

- (BOOL) startExecution:(id<QCPlugInContext>)context
{
   lastBoutData = [[NSDictionary alloc] init ];

   return YES;
}

- (BOOL) execute:(id<QCPlugInContext>)context atTime:(NSTimeInterval)time withArguments:(NSDictionary*)arguments
{

    NSLog(@"self.inputBoutData: %@", self.inputBoutData);
    NSLog(@"lastBoutData: %@", lastBoutData);


    // have new data, put it on the output
    self.lastBoutData = [NSDictionary dictionaryWithDictionary:self.inputBoutData];
    NSLog(@"assigned: %@", lastBoutData);

    return YES;
}

self.inputBoutData が入力されるまで、3 つの NSLog 行すべてが完全に機能することがログに示されていることがわかります。次に、ループの最後の NSLog 行で、self.inputBoutData が lastBoutData に正常にコピーされていることがわかります。

execute:atTime:withArguments: の次の実行では、self.inputBoutData はまだいっぱいですが、lastBoutData は再び空白です!!! どうやってそれが起こるのかわかりません。次に、最後のループと同様にもう 1 つのループを実行し、self.inputBoutData を lastBoutData に正常にコピーし、再度ログに記録します。次回は、2 番目の NSLog ステートメントの直前に BAD ACCESS を取得します。

lastBoutData が NSDictionary ではないというエラー メッセージが表示されたので、必死になって [lastBoutData 保持] を追加しましたが、クラッシュしませんでした。私はこの ivar をリリースしていないので、なぜそれを保持しなければならないのかわかりません。私は他の多くのパッチで他の ivar と非常によく似たことを問題なく行っています。何が欠けている可能性がありますか?なぜこれが私に解放されているのですか、それともそれが起こっているのですか?

4

1 に答える 1

5
self.lastBoutData = [NSDictionary dictionaryWithDictionary:self.inputBoutData];

dictionaryWithDictionary:自動解放された辞書を返します。そして、あなたの財産は(保持)されていなかったので、それを保持しているものは何もありませんでした. したがって、以前の辞書は逆参照されて漏洩し、新しい辞書は保持されません。

検討:

[lastBoutData release];
lastBoutData = [[NSDictionary alloc] initWithDictionary:self.inputBoutData];

または、コードをそのまま使用して、プロパティに保持を追加します。

于 2011-11-23T03:39:45.937 に答える