0

要返回 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 中被调用),我认为只有在应用退出时才会释放自动释放池中的许多列表。

那么选项 2 方法是更好的方法吗?

更新:

为了更清晰,我更新了 viewWillAppear 实现。

4

1 回答 1

2

认为在第二个例子中你打算打电话

self.studentsList = [self newListOfStudents];

如果这studentsList是一个retained 属性,那么现在会泄漏。

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

最干净的解决方案是

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

还有两个建议:

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

于 2012-10-04T12:13:33.933 回答