gpt4 book ai didi

iphone - ivars 的另一个内存管理查询

转载 作者:行者123 更新时间:2023-11-29 04:42:46 26 4
gpt4 key购买 nike

毫无疑问,关于 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]];

最佳答案

数组的第一个点

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 中执行此操作..但是在这里释放也会导致过度释放..要解决此问题,只需删除释放行并将代码更新为这样

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

在这里您可以看到将要创建的新实例将自动释放..并且其值将由您的变量保留

关于iphone - ivars 的另一个内存管理查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10120374/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com