1

現在、私のアプリケーションには、データの配列を出力するプロデューサーがあります。そのプロデューサーからの出力は、(XIB ファイルの「バインディング」を使用して) ウィンドウのテーブル ビューにバインドされます。プロデューサーがデータを吐き出し、それがウィンドウに表示されます。すべて問題ありません。

表示されているデータを変更する必要があることを除いて。プロデューサーはサードパーティのアプリなので、直接変更することはできません。そのため、2 つの間に位置するフィルター オブジェクトを作成する必要があります。

作成したオブジェクトは次のようになります。

@interface testFilter: NSObject {
id output;
}
-(void)setInput:(id)s;
@end

プロデューサーからの出力が入力に送られるようにバインディングを変更しました。

[myFilter bind:@"input" toObject:producer withKeyPath:@"output" options:0];

私の実装は次のようになります。

-(id)init
{
    self = [super init];
    output = nil;
    return self;
}

- (void)setInput:(id)newInput
{
    int nEntries = (int)[newInput count];
    id copiedArray = [NSMutableArray arrayWithCapacity:3];
    for (id entry in newInput)
    {
        id copiedEntry = [entry mutableCopy];
        // blah blah make some changes to copiedEntry
        [copiedArray addObject:copiedEntry];
        [copiedEntry release];   // I'm done with it, copiedArray added his own retain
    }
    [self setValue:copiedArray forKey:@"output"];

    [copiedArray release];   // I'm done with it, setValue/output added a retain
}

しかし、これはエラーでクラッシュしています:

「malloc: *** オブジェクト 0x108e00870 のエラー: 解放されるポインターが割り当てられませんでした」

...[copiedArray release]行を削除するまで。

送るべきだと思うのは間違ってい[copiedArray release]ますか?

他に何を確認できますか / このような問題をデバッグするための推奨される方法は何ですか?

4

1 に答える 1

9
id copiedArray = [NSMutableArray arrayWithCapacity:3];

これにより、自動解放されたオブジェクトが作成されます。自動解放されたオブジェクトを解放しないでください。

リリース コールを削除するか、その行を次のように変更します。

id copiedArray = [[NSMutableArray alloc] initWithCapacity:3];

そうは言っても、自動参照カウント (ARC)の使用を検討してください。


Advanced Memory Management Programming Guideから:

あなたが作成したオブジェクトはあなたが所有します

名前が、、、、または(たとえば、、、allocまたは ) newで始まるメソッドを使用してオブジェクトを作成します。copymutableCopyallocnewObjectmutableCopy

保持を使用してオブジェクトの所有権を取得できます

受信したオブジェクトは通常、受信したメソッド内で有効であることが保証されており、そのメソッドはオブジェクトをその呼び出し元に安全に返すこともできます。次の 2 つの状況で使用retainします。(1) アクセサー メソッドまたは init メソッドの実装で、プロパティ値として格納するオブジェクトの所有権を取得する場合。(2) 他の操作の副作用としてオブジェクトが無効化されるのを防ぐため。

必要がなくなったら、所有しているオブジェクトの所有権を放棄する必要があります

release オブジェクトにメッセージまたはメッセージを送信することにより、オブジェクトの所有権を放棄しautoreleaseます。したがって、Cocoa の用語では、オブジェクトの所有権を放棄することは、通常、オブジェクトを「解放する」と呼ばれます。

自分が所有していないオブジェクトの所有権を放棄してはなりません

これは、前述のポリシー ルールの結果にすぎません。

于 2013-05-15T19:53:58.933 に答える