毫无疑问,有很多信息需要: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]];
答案 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];
在这里,您会看到将要自动释放的新实例将被自动释放..其值将由您的变量保留