我正在尝试使NSTableDataSource兼容对象,并将此对象作为DataSource提供给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消息,所以没有对象被删除,当我传输数据时,我已经做了保留消息调用everywhere。
NSArrayDataSource* nsds = [[NSArrayDataSource alloc] initWithArray: myArray];
[tableView setDataSource:nsds];我有一个疑问,在创建新对象时,NSArray是否会为每个对象调用retain,或者它只是存储指针值?
假设我的对象名为"SLProject“,那么当我调试时,在init方法中,我正确地看到了调试窗口下的值,但在tableView委托方法中,内部数组的调试器显示类型为"NSKVONotifying_SLProject”的对象,并且它们指向无效数据,但是地址是正确的。
发布于 2009-04-05 15:44:09
我的第一个怀疑是没有保留SLProject类的-name NSString属性。知道调试日志中描述崩溃的消息会很有帮助,因为如果没有它,我们只是猜测而已。
至于你的类名的"NSKVONotifying_“前缀,当你使用键值观察时,Cocoa会在运行时创建你对象的一个子类。这是正常的,不太可能是问题的原因。
发布于 2009-04-05 14:10:27
对于您提出的有关创建NSArray对象的问题,答案是肯定的,每个对象在添加到数组时都会收到一条retain消息,在删除时会收到一条release消息。来自Apple文档:
一般而言,您添加到数组中的对象不会被复制;相反,每个对象在其id添加到数组之前都会收到一条保留消息。当一个对象从数组中被移除时,它会被发送一个释放消息。
至于你的对象的name函数,它是如何实现的?如果你用[obj description]替换[obj name],你的应用程序还会崩溃吗?
https://stackoverflow.com/questions/718940
复制相似问题