谁能帮我弄清楚我应该在哪里发布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];

您可以立即删除releaseretain调用,因为这是自动处理的。确保还要在dealloc方法中添加一行以清除变量。
self.sortedArray = nil;

..它将为您在数组上调用release

编辑:这也适用于exerciseArray,这是您的实际问题。无论何时涉及Cocoa类,都可以使用@property (retain)@synthesize简化内存管理。对于NSInteger和其他原始类型,或者当您不想持有该对象的所有权引用时,请改为使用@property (assign)

10-07 19:13