我知道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中的释放对应于我在我的属性中设置的保留,所以我在哪里发布
答案 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)
在您的情况下,我会经常在viewDidUnload
和dealloc
中发布它。
我喜欢在分配内存的位置维护镜像。在viewWillAppear
完成后,我会在viewWillDisappear
中发布。
既然你说这是通过课程使用的,我会用init
方法或awakeFromNib
分配,然后在dealloc
中发布一次。