Objective c 为什么我需要不断地重新加载数据以填充NSTableView?

Objective c 为什么我需要不断地重新加载数据以填充NSTableView?,objective-c,core-data,nsarray,nstableview,Objective C,Core Data,Nsarray,Nstableview,我在Objective-C工作,在我的项目中遇到了一个一致的问题。我有一堆NStableView,到目前为止,我一直必须在我的两个函数中不断“重新加载”数据:numberOfRowsInTableView和用内容填充它们的函数 例如,我的“loadData()”函数用一个获取请求(使用核心数据)填充在我的.h文件中声明的数组 我只想在“awakeFromNib”函数中访问这个loadData()函数,或者在更新内容时访问它。但是,我发现如果不在两个必需的NSTableView函数的顶部添加对函数

我在Objective-C工作,在我的项目中遇到了一个一致的问题。我有一堆NStableView,到目前为止,我一直必须在我的两个函数中不断“重新加载”数据:numberOfRowsInTableView和用内容填充它们的函数

例如,我的“loadData()”函数用一个获取请求(使用核心数据)填充在我的.h文件中声明的数组

我只想在“awakeFromNib”函数中访问这个loadData()函数,或者在更新内容时访问它。但是,我发现如果不在两个必需的NSTableView函数的顶部添加对函数的调用,程序就会崩溃

这开始引起问题,因为我认为在没有任何变化的情况下不断地从核心数据文件获取数据是非常多余的

下面是一些代码:

- (int)numberOfRowsInTableView:(NSTableView *)aTableView {
[self loadData];

if ([aTableView isEqual:(invoicesListTable)])
{
    return (int)[fetchedInvoices count];
}}
如果我没有包含[self-loadData]函数,程序将崩溃。即使在awakeFromNib函数中有[self-loadData],也会发生这种情况

为什么我的程序没有“记住”我的fetchedInvoices数组的值?它在my.h文件中声明如下:
NSArray*fetchedInvoices

我的“loadData”功能如下:

- (void)loadData {
NSError *error = nil;


// fetch all invoices
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Invoice"
                                          inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]
                                    initWithKey:@"InvoiceNumber" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];


fetchedInvoices = [managedObjectContext executeFetchRequest:fetchRequest error:&error];


if (fetchedInvoices == nil) {
    NSLog(@"ERROR");
}
[fetchRequest release];
// end of invoice fetch

任何帮助都将不胜感激。

因为您没有使用ARC–我在代码中看到了对
-release
的调用–您必须确保对象在您想要的时间内保持不变

特别是,
-executeFetchRequest:error:
返回一个您不拥有的数组。它有一个不可预测的一生。因为你要保留它很长一段时间,所以你需要保留它。如果您保留了它,那么您当然有责任在不再需要它时释放它

确保内存管理正确的最佳方法(除了使用ARC)是将其限制在
-init
-dealoc
和属性的设置器中。因此,您应该使用适当的所有权语义(
strong
retain
、或
copy
)为
fetchedInvoices
实现或
@合成一个setter,并使用它来设置属性,而不是直接分配实例变量

例如,您可以在类的
@接口中放置以下内容:

@property (copy) NSArray *fetchedInvoices;
然后,在您的
@实现中
,您可以:

@synthesize fetchedInvoices;
或者,您可以使用setter声明所需的语义来实现setter

然后,代替这一行:

fetchedInvoices = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
您可以这样做:

self.fetchedInvoices = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
或者,相当于:

[self setFetchedInvoices:[managedObjectContext executeFetchRequest:fetchRequest error:&error]];

由于您没有使用ARC–我在代码中看到了对
-release
的调用–因此您必须确保对象能够在您想要的时间内保持不变

特别是,
-executeFetchRequest:error:
返回一个您不拥有的数组。它有一个不可预测的一生。因为你要保留它很长一段时间,所以你需要保留它。如果您保留了它,那么您当然有责任在不再需要它时释放它

确保内存管理正确的最佳方法(除了使用ARC)是将其限制在
-init
-dealoc
和属性的设置器中。因此,您应该使用适当的所有权语义(
strong
retain
、或
copy
)为
fetchedInvoices
实现或
@合成一个setter,并使用它来设置属性,而不是直接分配实例变量

例如,您可以在类的
@接口中放置以下内容:

@property (copy) NSArray *fetchedInvoices;
然后,在您的
@实现中
,您可以:

@synthesize fetchedInvoices;
或者,您可以使用setter声明所需的语义来实现setter

然后,代替这一行:

fetchedInvoices = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
您可以这样做:

self.fetchedInvoices = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
或者,相当于:

[self setFetchedInvoices:[managedObjectContext executeFetchRequest:fetchRequest error:&error]];

这是一个复杂问题的好答案。我想添加一个苹果文档的链接:非常感谢!我觉得这和内存管理有关。不客气。我很高兴能帮上忙。我提到但没有详细说明的一件事是确保在
-dealoc
实现中执行
[fetchedInvoices release]
,这样就不会泄漏。您能详细说明一下吗?我应该在所有类中都使用-dealloc函数吗?我什么时候叫它?(当我处理完该类时,可能是这样的…)任何拥有资源的类都应该有一个释放资源的
-dealoc
方法。您不能调用
-dealoc
(除非您的
-dealoc
应该调用
[super dealoc]
)。当一个对象被其所有所有者释放时,将调用它。这是非常基本的,基本的东西。请参阅和。这是一个复杂问题的好答案。我想添加一个苹果文档的链接:非常感谢!我觉得这和内存管理有关。不客气。我很高兴能帮上忙。我提到但没有详细说明的一件事是确保在
-dealoc
实现中执行
[fetchedInvoices release]
,这样就不会泄漏。您能详细说明一下吗?我应该在所有类中都使用-dealloc函数吗?我什么时候叫它?(当我处理完该类时,可能是这样的…)任何拥有资源的类都应该有一个释放资源的
-dealoc
方法。您不能调用
-dealoc
(除非您的
-dealoc
应该调用
[super dealoc]
)。当一个对象被其所有所有者释放时,将调用它。这是非常基本的,基本的东西。请参阅和。