簡體   English   中英

NSTableDataSource中帶有自定義對象的NSArray

[英]NSArray with Custom Objects in NSTableDataSource

我正在嘗試使NSTableDataSource兼容對象並將此對象作為數據源提供給NSTableView,但是當表嘗試顯示數據時,它會崩潰。

@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

誰能告訴我可能是什么問題?

現在,我已經從類中刪除了每個版本和dealloc消息,因此沒有對象被刪除,在傳輸數據時,我在所有位置都完成了保留消息調用。

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

我有一個疑問,NSArray在創建新對象時是否會為每個對象調用[retain]還是只是存儲指針值?

假設我的對象的名稱是“ SLProject”,那么當我調試時,在init方法中我可以正確看到調試窗口下的值,但是在tableView委托方法中,internalArray的調試器顯示的對象類型為“ NSKVONotifying_SLProject”,並且它們指向無效的數據,但是地址正確。

是的,在回答有關NSArray對象創建的問題時,是的,每個對象在添加到陣列時都會收到retain消息,而在刪除時會收到release消息。 從Apple文檔中:

通常,不會復制添加到數組中的對象。 相反,每個對象在將其ID添加到數組之前都會收到保留消息。 從數組中刪除對象時,會發送釋放消息。

至於對象的name功能,如何實現? 如果將[obj name]替換為[obj description] ,這是否還會使您的應用程序崩潰?

我的第一個懷疑是SLProject類的-name NSString屬性沒有保留。 了解調試日志中描述崩潰的消息會有所幫助,因為如果沒有該消息,我們只是在猜測。

至於類名上的“ NSKVONotifying_”前綴,在運行時,當您使用鍵值觀察時,Cocoa將創建對象的子類。 這是正常現象,不太可能是造成問題的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM