在iOS应用程序中使用自动释放的对象

时间:2012-10-04 11:54:25

标签: objective-c nsautoreleasepool

要返回NSArray或NSDictionary,我看到大多数人都使用以下实现,这也是一些书籍的建议。 (iOS开发实用方法 - )

选项1

  -(NSArray*)listOfStudents{

    NSMutableArray *temp = [[NSMUtableArray alloc] init];

    //Add elements to the array
    //
    //
    //
    NSArray *students =  [NSArray arrayWithArray:temp];

    return students;
    }



 -(void)viewWillAppear{

    self.studentsList = [self listOfStudents];
    }

但同样可以通过以下方式完成吗?

选项2

 -(NSArray*)newListOfStudents{

    NSMutableArray *temp = [[NSMUtableArray alloc] init];
    NSArray *students = [[NSArray alloc]initWithArray:temp];
    [temp release];
    //Add elements to the array
    //
    //
    //


    return students;
    }


-(void)viewWillAppear{



  NSArray *array = [self newListOfStudents];
    self.studentsList = array;
    [array release];

    }

假设在主线程本身中调用这些方法。

内存使用的间隔,我认为第二个选项是好的,因为它不会创建自动释放的对象,因为它们仅在自动释放池耗尽时才会释放。

我假设只有在应用程序退出时,主要自动释放池才会耗尽。因此,如果OPTION 1中的方法被多次使用,(因为它们在ViewWillAppear中被调用),我认为许多列表将在自动释放池中,只有在应用程序退出时才会释放。

OPTION 2方法也是更好的方法吗?

更新:

我已更新了viewWillAppear实现,以便更清晰。

1 个答案:

答案 0 :(得分:2)

想想在你要打电话的第二个例子中

self.studentsList = [self newListOfStudents];

如果studentsListretain ed属性,现在就会泄漏。

此外,两个示例中的临时数组都是无用的开销。在第二个例子中,这简直是胡说八道。

最干净的解决方案是

-(NSArray *)listOfStudents {
   NSMutableArray *list = [NSMutableArray array];
   // Add things to array
   return list;
}

另外两个建议:

1)您可以在代码上运行静态分析器,这将指向内存问题 2)如果您对内存管理更有信心,请切换到ARC。