谁能帮我弄清楚我应该在哪里发布exerciseArray
?我在调用dealloc
之前释放sortedArray
时崩溃了。此代码被多次调用。
//Set exerciseArray
review.exerciseArray = [[workout assignedExercises] allObjects];
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSLog(@"viewWillAppear");
NSString *workoutName = [event.assignedWorkout valueForKey:@"name"];
self.title = workoutName ;
NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"index"
ascending:YES] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
[sortedArray release];
sortedArray= [exerciseArray sortedArrayUsingDescriptors:sortDescriptors];
NSLog(@"*****SORTEDARRAY****** %d",[sortedArray retainCount]);
for (Exercise *ex in sortedArray){
NSLog(@"%@ %@ %@",ex.name , ex.repCount, ex.weight);
}
NSLog(@"*********************");
[sortedArray retain];
[self.tableView reloadData];
}
- (void)dealloc {
[super dealloc];
[managedObjectContext release];
[event release];
}
最佳答案
首先,您应该将[super dealloc]
调用移到dealloc
方法的末尾。首先处理您的自定义变量,然后做的最后一件事是将dealloc
推送到 super class ,以处理其余的清理工作。
现在,我担心其中的[sortedArray release]
和[sortedArray retain]
。为了节省在retain
ivar上实现release
/ sortedArray
的语义,应该做的是声明sortedArray
的属性,如下所示:
// this goes in your @interface
@property (nonatomic, retain) NSArray *sortedArray;
// this goes in your @implementation
@synthesize sortedArray;
现在,您可以轻松设置
sortedArray
,而不必担心保留或释放:// note the use of self, this is required
self.sortedArray = [exerciseArray sortedArrayUsingDescriptors:sortDescriptors];
您可以立即删除
release
和retain
调用,因为这是自动处理的。确保还要在dealloc
方法中添加一行以清除变量。self.sortedArray = nil;
..它将为您在数组上调用
release
。编辑:这也适用于exerciseArray,这是您的实际问题。无论何时涉及Cocoa类,都可以使用
@property (retain)
和@synthesize
简化内存管理。对于NSInteger
和其他原始类型,或者当您不想持有该对象的所有权引用时,请改为使用@property (assign)
。