【问题标题】:Memory Leak Field Variable内存泄漏字段变量
【发布时间】:2011-05-17 22:21:52
【问题描述】:

我不明白为什么我不能简单地添加 [sortedArray release];在这个方法的最后。每次我这样做,它都会崩溃。

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSString *workoutName =  [event.assignedWorkout valueForKey:@"name"];
self.title = workoutName ;
NSMutableArray *sortedArray = [[NSMutableArray alloc]init];

// Sort ExerciseArray
int y = 0;
int x= 0;
do{
    if ([[[exerciseArray objectAtIndex:y] index]intValue] == x){
        [sortedArray addObject:[exerciseArray objectAtIndex:y] ];
        x++;
        }
        if (y<[exerciseArray count]-1){
                y++;
            }else {
                y=0;
            }

}
while(x <= [exerciseArray count]-1);

exerciseArray = sortedArray;
[self.tableView reloadData];

}

如果有人能指出我正确的方向或向我推荐一些文档,将不胜感激。

【问题讨论】:

  • 只是出于好奇,为什么要在方法末尾加上[sortedArray release]

标签: iphone objective-c ios4 memory-management memory-leaks


【解决方案1】:

您将数组分配给exerciseArray 变量,然后释放数组。下次您尝试访问 exerciseArray 变量时,该数组将消失,因为将其分配给 exerciseArray 变量不会增加其保留计数。

第一次调用alloc 时,数组对象的保留计数为1。当你把它赋值给executiveArray时,它的retain值仍然是1。然后,当你释放它时,它的retain count下降到0,你不能指望再次访问这个数组。

您不应该释放它(我的偏好),或者通过调用显式保留它:

[exerciseArray release];
exerciseArray = [sortedArray retain];
[sortedArray release];

注意这两条消息的顺序。第一行释放exerciseArray 变量指向的任何现有对象。第二行将新数组的保留计数提高到 2,然后第二行将其降低到 1,因此数组仍然保留。如果在将新数组分配给exerciseArray 变量之前释放sortedArray,则保留计数变为0,并且在将其分配给新变量之前您将丢失它。

【讨论】:

  • exerciseArray 应该在被分配一个新值之前被释放。
  • 知道了!非常感谢您的详细解释。我越来越了解MM了..
  • 荷哈巴是对的。如果exerciseArray 已经指向一个保留对象,那么您应该在为其分配新值之前调用[exerciseArray release]。否则,该对象将作为内存泄漏保留在内存中。
  • 是的,如果没有垃圾回收,内存管理在 obj-c 中会变得混乱。您确实必须小心谨慎,但是当您掌握它时会很令人满意。
  • @Steve -- 只是对未来的说明:谨防将保留计数视为绝对数字。框架可能会在您不知情的情况下保留您的各种对象。虽然 Apple 的文档确实说“alloc 创建保留计数为 1”,但您应该始终只考虑您的“个人”保留计数——你提出了多少所有权声明,以及你放弃了多少——而不是推测对象计数的“真实”值。 (除了@Charlie:并不是说你是在暗示这个;只是一个附录。)
【解决方案2】:

你可能想这样做:


[exerciseArray release];
exerciseArray = sortedArray;
[self.tableView reloadData];

顺便说一句,您可以使用带有 sortedArrayUsingComparator 的块对数组进行排序。

【讨论】:

  • 稍后我需要为我的 didSelectAtIndexPath 方法使用 exerciseArray。我尝试释放它,但仍然崩溃。 Instruments 一直指向 sortedArray。
  • 仪器指向您分配的数组。行“exerciseArray = sortedArray;”是有问题的。您需要像我在上面的答案中提出的那样释放先前的练习数组,或者在分配时(并且它仅分配一个指针),您将失去对先前内容的引用并有效地泄漏它们。当您分配时(并且不要释放 sortedArray,因为它们都指向同一个内存),您稍后可以使用 exerciseArray。
  • @SteveBay22:这是正确的,但作为解释:你不想要释放sortedArray,因为你分配给exerciseArray不会增加您保留的数量。当您 alloc sortedArray 时,您拥有一个,而当您将该对象分配给一个新名称时,您仍然拥有一个。如果您以任一名称释放它,您将不再拥有所有权,并且如果它从您手下被解除分配,您也不能抱怨。 :)
  • 我刚刚阅读了 Apple 的内存管理编程指南,非常有帮助。 developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/…
猜你喜欢
  • 2019-04-11
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 2014-05-25
  • 2013-07-21
  • 2013-11-06
  • 2014-08-19
  • 1970-01-01
相关资源
最近更新 更多