问题描述
|
我有两个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块中都使用花括号,即使它们只有一行-事后很难发现这些错误 soapbox>
请发布您的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,从未被调用。
谢谢大家的帮助。