0

毫无疑问,有大量的信息: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 方法中分配/初始化它,并将它添加到一个数组(这里没有显示其他一些按钮),然后再使用这个数组将按钮添加到导航栏。然后我释放了editButton,因为我已经分配了它并将它交给了一个数组。考虑到我的 dealloc 方法,这是必要的还是必要的,甚至是在正确的地方?

提前谢谢了

编辑:进一步的问题3:

在我的代码中的其他地方访问这些 ivars 时(比如调用 [datasourceArray count] 或将“编辑”按钮的标题重置为“完成”时,我是否应该使用 self.notation?

编辑:进一步的问题4:

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

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

1 回答 1

1

数组的第一个点

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

return datasource;

在这里你做对了..返回一个自动释放的对象..它将被变量保留,因为你将它定义为保留类型(当你这样做时@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中做的..但在这里发布也会导致过度发布..解决这个问题只需删除发布行并将您的代码更新为这样

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

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

于 2012-04-12T09:03:37.317 回答