首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在NSTableDataSource中使用自定义对象的NSArray

在NSTableDataSource中使用自定义对象的NSArray
EN

Stack Overflow用户
提问于 2009-04-05 13:34:54
回答 2查看 1.7K关注 0票数 0

我正在尝试使NSTableDataSource兼容对象,并将此对象作为DataSource提供给NSTableView,但是当表尝试显示数据时,它会崩溃。

代码语言:javascript
运行
复制
@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。

代码语言:javascript
运行
复制
NSArrayDataSource* nsds = [[NSArrayDataSource alloc] initWithArray: myArray];
[tableView setDataSource:nsds];

我有一个疑问,在创建新对象时,NSArray是否会为每个对象调用retain,或者它只是存储指针值?

假设我的对象名为"SLProject“,那么当我调试时,在init方法中,我正确地看到了调试窗口下的值,但在tableView委托方法中,内部数组的调试器显示类型为"NSKVONotifying_SLProject”的对象,并且它们指向无效数据,但是地址是正确的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-04-05 15:44:09

我的第一个怀疑是没有保留SLProject类的-name NSString属性。知道调试日志中描述崩溃的消息会很有帮助,因为如果没有它,我们只是猜测而已。

至于你的类名的"NSKVONotifying_“前缀,当你使用键值观察时,Cocoa会在运行时创建你对象的一个子类。这是正常的,不太可能是问题的原因。

票数 1
EN

Stack Overflow用户

发布于 2009-04-05 14:10:27

对于您提出的有关创建NSArray对象的问题,答案是肯定的,每个对象在添加到数组时都会收到一条retain消息,在删除时会收到一条release消息。来自Apple文档:

一般而言,您添加到数组中的对象不会被复制;相反,每个对象在其id添加到数组之前都会收到一条保留消息。当一个对象从数组中被移除时,它会被发送一个释放消息。

至于你的对象的name函数,它是如何实现的?如果你用[obj description]替换[obj name],你的应用程序还会崩溃吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/718940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档