何时释放整个班级使用的对象?

时间:2011-09-26 01:47:02

标签: iphone objective-c ipad memory-management

我知道Objective-C中的内存管理的基本规则是,对于你做alloc的每个对象,你需要在某个地方释放它。

说我有以下内容:

@interface NewPollViewController : UIViewController 
{
   NSMutableArray * myArray;
}

@property (nonatomic, retain) NSMutableArray * myArray;

@implementation NewPollViewController
@synthesize myArray = _myArray;

- (void) viewDidLoad
{
  [super viewDidLoad];
  self.myArray = [[NSMutableArray alloc] init];
}

假设这个self.myArray用作UITableView的dataSource,那么我应该在何时何地发布这个?在dealloc?我想dealloc中的释放对应于我在我的属性中设置的保留,所以我在哪里发布

3 个答案:

答案 0 :(得分:3)

在您的示例中,您在技术上需要释放两次 - 一次在dealloc,一次在设置属性后立即:

NSMutableArray *a = [[NSMutableArray alloc] init];
self.myArray = a;
[a release];

这样做的原因是因为您专门在viewDidLoad中分配内存,然后在设置属性时增加保留计数。

避免这种情况的一种方法是使用其中一个静态NSMutableArray构造函数或使用autorelease,即。

self.myArray = [[[NSMutableArray alloc] init] autorelease];

或者,完全绕过该属性:

myArray = [[NSMutableArray alloc] init];

这样可以避免属性生成的额外保留(事实上,如果只在本地使用,你可以删除属性语句。)

答案 1 :(得分:1)

如果我想公开NSMutableArray,我会这样做:

@interface NewPollViewController : UIViewController 
{
   NSMutableArray * myArray;
}

@property (nonatomic, readonly) NSMutableArray * myArray;

@implementation NewPollViewController
@synthesize myArray;

- (void) viewDidLoad
{
  [super viewDidLoad];
  self.myArray = [[NSMutableArray alloc] init];
}

- (void) dealloc
{
   [myArray release],myArray = nil;
}

将属性更改为readonly,因为它的可变数组不希望其他类更改此数组,而是正确分配和释放它。

答案 2 :(得分:0)

在您的情况下,我会经常在viewDidUnloaddealloc中发布它。

我喜欢在分配内存的位置维护镜像。在viewWillAppear完成后,我会在viewWillDisappear中发布。

既然你说这是通过课程使用的,我会用init方法或awakeFromNib分配,然后在dealloc中发布一次。