NSURL
ドラッグアンドドロップされたファイル( s)を受け入れるビューベースのNSTableViewを使用してサンドボックス化されたARCアプリを作成しています。私は次のNSTableViewDelegate
方法でいくつかの重大な奇妙に遭遇しました:
- (NSView *)tableView:(NSTableView *)tv
viewForTableColumn:(NSTableColumn *)tc
row:(NSInteger)row
{
// `files' is an NSMutableArray* ivar containing NSURLs
// that have been dropped into this table
NSURL *url = [files objectAtIndex:row];
NSString *fileName = [url lastPathComponent];
NSImage *icon = [self iconForURL:url];
NSTableCellView *view = [tv makeViewWithIdentifier:[tc identifier] owner:self];
[[view textField] setStringValue:fileName];
[[view imageView] setImage:icon];
return view;
}
1つのファイルをテーブルビューにドラッグすると、正しく表示されます。2番目のファイルをドラッグすると、次のエラーが発生します。
***ドラッグセッション中に例外'NSRangeException'(理由'***-[__ NSArrayM insertObject:atIndex:]:インデックス1が空の配列の境界を超えています')が発生したため、ドラッグをキャンセルしました
デバッガーをステップスルーするfiles
と、を呼び出した後、「空になる」(実際には新しいオブジェクトインスタンスになる)ことがわかりましたmakeViewWithIdentifier:owner:
。これは私が理解していないARCの一部の側面だと思いますが、オブジェクトはそれ自体のivar(デフォルト)を強く参照しているように見えます。どうすればそれをリリースして、私の下から再作成できますか?
私はこれを回避するために2つのハックを考え出しました:
- テーブルセルビューの所有者としてivarを渡します(将来のリリースで強力な参照を保持し続けることを期待します)。また
- ivarのオブジェクトを指すローカル変数を作成し、ivarを古いオブジェクトに再割り当てします(これは、その間に置換配列を作成するため、明らかに無駄です)。
ここで何が欠けていますか?これらの回避策は必要ありません。