2009-04-05 9 views
0

NSTableDataSource互換オブジェクトを作成し、このオブジェクトをDataSourceとしてNSTableViewに渡そうとしていますが、テーブルがデータを表示しようとするとクラッシュします。NSTableDataSourceでカスタムオブジェクトを持つNSArray

@interface NSArrayDataSource : NSObject{ 
    NSArray* internalArray; 
} 
-(id) initWithArray: (NSArray*) objects; 
-(int)numberOfRowsInTableView:(NSTableView *)aTableView; 
-(id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex; 
-(void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex; 
@end 


@implementation NSArrayDataSource 

-(id) initWithArray: (NSArray*) objects{ 
    if(self = [super init]) 
    { 
     internalArray = [[NSArray alloc] initWithArray:objects]; 
    } 
    return self; 
} 

-(int)numberOfRowsInTableView:(NSTableView *)aTableView{ 
    return [internalArray count]; 
} 

-(id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex{ 
    id obj = [internalArray objectAtIndex:rowIndex]; 
     // when I debug, I get same pointers with invalid data 
     // each object has "name" message 
     // this following line gives invalid pointer and 
     // it crashes 
    return [obj name]; 
} 

-(void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex{ 
} 

@end 

誰でも問題の原因を教えていただけますか?

今は自分のクラスからすべてのリリースとデアロッコメッセージを削除しているので、オブジェクトは削除されません。データを転送するとどこでもメッセージの呼び出しが保持されます。新しいオブジェクトを作成したり、それだけでポインタ値を格納している間

NSArrayDataSource* nsds = [[NSArrayDataSource alloc] initWithArray: myArray]; 
[tableView setDataSource:nsds]; 

私は1つの疑問を持っているが、NSArrayのは、すべてのオブジェクトに対して、[保持]を呼び出すんでしょうか?

私のオブジェクトの名前が "SLProject"であるとすると、デバッグ時にinitメソッドで値が正しく表示されますが、tableView委譲メソッドでinternalArrayのデバッガが "NSKVONotifying_SLProject"型のオブジェクトを表示し、アドレスは正しいです。

答えて

1

私の最初の疑惑は、SLProjectクラスの-name NSStringプロパティが保持されていないことです。デバッグログ内のクラッシュを説明するメッセージを知っておくと、それがなくてもわかるだけです。

クラス名の "NSKVONotifying_"接頭辞については、実行時にKey Value Observingを使用しているときにCocoaがオブジェクトのサブクラスを作成します。これは正常で、問題の原因となる可能性は低いです。

+0

ありがとう、私はxmlから値を読み取っていた、私は便利なプロパティを使用していた、それはautoreleaseだった、私はコピーし、それが働き始めた。 ありがとうございます。 –

1

NSArrayオブジェクト作成についての質問に答えて、はい、各オブジェクトは配列に追加されるときにretainメッセージを受け取り、削除するとreleaseメッセージを受け取ります。 Appleドキュメントから:

一般に、配列に追加するオブジェクトはコピーされません。むしろ、各オブジェクトはそのIDが配列に追加される前に保持メッセージを受け取ります。オブジェクトが配列から削除されると、解放メッセージが送信されます。

オブジェクトのname機能については、どのように実装されていますか? [obj name][obj description]に置き換えると、アプリケーションがクラッシュすることはありますか?

+0

このようなオブジェクトを初期化すると... SLProject * p = [[SLProject alloc] init]; ここではautoreleaseを指定していないので、このオブジェクトは決して割り当て解除されません。私はそれを配列を追加し、配列が削除されるとどうなるでしょうか?このオブジェクトは、私がautoreleaseを作成したままで残っていますか? –

+0

ご協力いただきありがとうございます。 –

+0

最初のコメントに応じて、オブジェクトが配列に追加されるとオブジェクトを解放するのが一般的です(保持カウントはインクリメントされ、デクリメントされ、ネット効果はありません)。つまり、配列が存在するときにオブジェクトを解放する必要はありません。それ以外の場合は、メモリリークが発生します。 –

関連する問題