另一个用于ivars的内存管理查询

时间:2012-04-12 08:55:09

标签: iphone ios memory-management memory-leaks

毫无疑问,有很多信息需要:iOS中的内存管理。阅读了大量关于它的内容后,我仍然不清楚某些情况下的“最佳”练习。我可以在下面的两个例子中寻求澄清......

我有一个NSMutableArray作为tableView的数据源,一个名为editButton的UIBarButtonItem声明如下:

@interface MyTableViewController : UITableViewController {

   NSMutableArray *datasourceArray;
   UIBarButtonItem *editButton;

}

@property (nonatomic, retain) NSMutableArray *datasourceArray;
@property (nonatomic, retain) UIBarButtonItem *editButton;

@end

然后我合成了它们并按如下方式分配/初始化它们:

@implementation

@syntesize datasourceArray, editButton;

-(void)viewDidLoad {

self.datasourceArray = [self retrieveDatasourceArray];

self.editButton = [[UIBarButtonItem alloc] initWithTitle:@"Edit" style:UIBarButtonItemStylePlain target:self action:@selector(editTable)];
[self.navigationItem setRightBarButtonItems:[NSArray arrayWithObjects:editButton, nil] animated:NO];
[editButton release];

}

-(void)retrieveDatasourceArray {

NSMutableArray *datasource = [[[NSMutableArray alloc] initWithObjects @"example1", @"example2", nil] autorelease];

return datasource;

}

-(void)dealloc {

[datasourceArray release];
[editButton release];
[super dealloc];

}

问题1:NSMutableArray

正如你所看到的,我已经将数组的实际创建分离为一个不同的方法,因为有很多代码从核心数据中检索并且正在进行排序(这个问题不需要),我想将其分离出来。因此,我选择返回一个自动释放的NSMutableArray,并将其设置为头文件中定义的self.datasourceArray。这是一种明智无泄漏的实现方式吗?

问题2:编辑按钮

由于我需要稍后更改editButton的标题和样式,我需要访问它,因此声明它。然后我在viewDidLoad方法中分配/初始化它并将其添加到数组(此处未显示其他一些按钮),然后使用此数组将按钮添加到navigationBar。然后我释放了editButton,因为我已将其分配并将其传递给数组。鉴于我的dealloc方法,这是必要的还是必要的,甚至是在正确的地方?

非常感谢提前

编辑:进一步的问题3:

当我在我的代码中的其他地方访问这些ivars中的任何一个时(比如在调用[datasourceArray count]或将'Edit'按钮的标题重置为'Done'时,我应该使用self。表示法吗?

编辑:进一步的问题4:

在其他地方,我使用以下代码初始化合成的NSMutableArray。鉴于以下答案,这是否更为漏洞......?

[self setDatasourceArray: [[NSMutableArray arrayWithArray: [self retrieveDatasourceArray]];

1 个答案:

答案 0 :(得分:1)

数组的第一点

NSMutableArray *datasource = [[[NSMutableArray alloc] initWithObjects @"example1", @"example2", nil] autorelease];

return datasource;

这里你正在做正确 ..返回一个自动释放的对象..变量将保留它,因为你将它定义为类型retain(当你做@property)。

编辑按钮的第二个点

self.editButton = [[UIBarButtonItem alloc] initWithTitle:@"Edit" style:UIBarButtonItemStylePlain target:self action:@selector(editTable)];

[self.navigationItem setRightBarButtonItems:[NSArray arrayWithObjects:editButton, nil] animated:NO];

[editButton release];

在这里你显然过度释放对象.. 记住变量保留你定义的新变量。所以编辑按钮保留新的条形按钮项。然后释放它。是必要的一次..你在dealloc做什么..但在这里发布也会导致overrelease..解决这个问题只需删除发布行并更新你的代码就好了吗

self.editButton = [[[UIBarButtonItem alloc] initWithTitle:@"Edit" style:UIBarButtonItemStylePlain target:self action:@selector(editTable)]autorelease];
[self.navigationItem setRightBarButtonItems:[NSArray arrayWithObjects:editButton, nil] animated:NO];

在这里,您会看到将要自动释放的新实例将被自动释放..其值将由您的变量保留