2011-09-26 50 views
2

我知道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的数据源,所以当我应该在哪里释放呢?在dealloc中?我想在dealloc中的版本对应于我在属性中设置的保留,所以我在哪里发布

回答

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]; 

这将避免产生额外的保留由财产(事实上,你可以摆脱财产声明,如果它只是在本地使用)。

+0

你也想在'dealloc'中发布它。 – Chuck

+1

'self.myArray = [NSMutableArray数组]'可能比'alloc','init','autorelease'三重奏更简洁。 –

+0

我同意 - 我更喜欢这种形式 –

0

在你的情况下,我经常会在viewDidUnload以及dealloc中发布它。

我喜欢维护一个关于内存分配的镜像。当它在viewWillAppear完成时,我发布在viewWillDisappear

现在既然你说这是用到了班级,我会分配一个init方法,或者awakeFromNib,然后在dealloc中发布一次。

+0

对于第三种选择,您仍然必须将其释放两次......为什么当您在init中使用Lloc时,您只需要释放它一次? – xonegirlz

+0

因为它与视图或其装载或可见不相关。当它最终转到'dealloc'时是你想要释放它的时候。如果这是'myArrayOfSubviews',那么你可能会做加载/卸载的创建和释放,以正确响应内存警告。 – EricLeaf

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; 
} 

改为只读属性,因为它的可变数组,你不希望其他类更改此数组,你是正确alloc和释放它。

+0

NSMutableArray只是一个例子,它可以是任何对象 – xonegirlz

+0

如果它的String Literal和一个iVar分配给它,那么你不会分配和释放它。如果它的String对象使用copy,并且不需要在viewDidLoad中alloc和init。通常情况下,您不会以保留形式拨打有关财产的拨款 – ARC

+1

@Nikita - 你的代码在技术上会泄漏。要在一行中设置属性,您应该使用NSMutableArray静态构造函数或autorelease之一。除非你从初始化阵列的地方移除“自我”。请参阅http://stackoverflow.com/questions/156243/object-allocate-and-init-in-objective-c/167783#167783 –