第二次查看tableview后出现内存泄漏

问题描述

| 我有两个UITableViewControllers。我要推送到第二个,并在viewDidLoad中调用以下方法。 第二次我处理此视图并回到第一个视图时,出现内存泄漏。 Instruments说问题出在以下方法的最后一行。
- (void)fetchRecords {   

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:@\"Articulation\" inManagedobjectContext:[self managedobjectContext]]];

    nspredicate *predicate = [nspredicate predicateWithFormat:@\"articulationGroup == %@\",selectedArticulationGroup];
    [request setPredicate:predicate];

    static NSArray *sortDescriptors = nil;
    if (!sortDescriptors)
        sortDescriptors = [[NSArray alloc] initWithObject:[[[NSSortDescriptor alloc] initWithKey:@\"text\" ascending:NO] autorelease]];
    [request setSortDescriptors:sortDescriptors];

    NSError *error = nil;
    NSArray *fetchResults = [managedobjectContext executeFetchRequest:request error:&error];
    if (!fetchResults)
        NSLog(@\"no fetch results ArticulationsViewController,error %@\",error);
    [request release];

    self.articulationsArray = [NSMutableArray arrayWithArray:fetchResults];

}
我不知道...上床睡觉:\'(     

解决方法

一方面,如果使用分配分支,则会泄漏sortDescriptors数组。 我强烈建议您在所有if / else块中都使用花括号,即使它们只有一行-事后很难发现这些错误 请发布您的dealloc方法和ivar声明。     ,好吧,我注意到两件事可能是正确的,但无论如何我都想问一下。 首先,您在if语句中询问:
if (!fetchResults)
。那意味着
fetchResults
可能不存在。尽管如此,您还是尝试使用该数组初始化一个数组。 其次,我不知道您如何分配
articulationsArray
,但是将行更改为
self.articulationsArray = [[NSMutableArray alloc] initWithArray:fetchResults]]
是否有效果?     ,为什么您的
sortDescriptors
数组是静态的?通常,您将执行以下操作:
NSSortDescriptor *textSort = [[NSSortDescriptor alloc] initWithKey:@\"text\" ascending:NO];

[fetchRequest setSortDescriptors:[NSArray arrayWithObject:textSort]];

[textSort release];
另外,在
if (!fetchResults)
之后,您不应该保存数组,但应执行以下操作:
if (!fetchResults)
{
    NSLog(@\"no fetch results ArticulationsViewController,error %@\",error);
}
else
{
    NSMutableArray *articulationsArray_tmp = [fetchResults mutableCopy];
    self.articulationsArray = articulationsArray_tmp;
    [articulationsArray_tmp release];
}

[request release];
还要注意如何设置
articulationsArray
。人们应该对这些... 10s保持谨慎……:)     ,此块是完全不必要的,并且很危险:
static NSArray *sortDescriptors = nil;
if (!sortDescriptors)
    sortDescriptors = [[NSArray alloc] initWithObject:[[[NSSortDescriptor alloc] initWithKey:@\"text\" ascending:NO] autorelease]];
[request setSortDescriptors:sortDescriptors];
任何静态对象都对内存有害,仅在特殊情况下才使用它们。为什么将仅具有本地作用域的数组固定到特定的地址/块?所有这些都可以用一行代替:
[request setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortWithKey:@\"text\" ascending:NO]]];
...及其完成。 该行可能是不必要的,并且可能在以后引起问题:
self.articulationsArray = [NSMutableArray arrayWithArray:fetchResults];
为什么需要可变的获取对象数组?在保持图形完整性而无需重新获取的情况下,您无法真正直接在数组中添加或删除任何内容。 只是:
self.articulationsArray = fetchResults;
在大多数情况下都可以正常工作。 创建的对象越多,创建泄漏的机会就越大。使事情尽可能简单。     ,好吧...我感觉就像鹅一样。 当我弹出第一个tableViewController时,我没有释放articulationsArray。 我在用
- (void)viewDidUnload {
    [self.articulationsArray release];
}
当我应该一直使用时:
-(void)viewDidDisappear:(BOOL)animated {
    [self.articulationsArray release];
}
ViewDidUnload,从未被调用。 谢谢大家的帮助。