【发布时间】:2009-04-05 13:34:53
【问题描述】:
我正在尝试使 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
谁能告诉我可能是什么问题?
现在我已经从我的类中删除了所有的 release 和 dealloc 消息,所以没有对象被删除,我在传输数据时到处都完成了保留消息调用。
NSArrayDataSource* nsds = [[NSArrayDataSource alloc] initWithArray: myArray];
[tableView setDataSource:nsds];
我有一个疑问,NSArray 是在创建新对象时为每个对象调用 [retain] 还是只是存储指针值?
假设我的对象名称是“SLProject”,那么当我调试时,在 init 方法中我可以正确看到调试窗口下的值,但在 tableView 委托方法中,internalArray 的调试器显示类型为“NSKVONotifying_SLProject”的对象,它们指向无效数据,但是地址是正确的。
【问题讨论】:
标签: objective-c macos memory memory-management