1

我有一个这样声明的变量:

@property (nonatomic, retain) NSMutableArray *aInfo;

在开始时,如果我这样声明变量:

self.aInfo = [[NSMutableArray alloc] init];

在应用程序的每个点,我都可以用断点停止执行并像这样打印变量内容:

po self.aInfo

但是,如果我使用 autorelease 声明变量(应该如此),我将无法在断点中看到内容......

self.aInfo = [[[NSMutableArray alloc] init] autorelease];

PD:如果我执行类似 NSLog(@"%@", self.aInfo) 的操作,我可以看到内容...

4

1 回答 1

1

如果我用 autorelease 声明变量(应该是这样)......

因为它应该。试试这个:

NSMutableArray *aNewArray = [[NSMutableArray alloc] init];
self.aInfo = aNewArray;
[aNewArray release];

或者使用一种方便的方法,它在自动释放池中并且您不拥有,因此可以直接分配它:

self.aInfo = [NSMutableArray array];

或者:

self.aInfo = [NSMutableArray arrayWithCapacity:20]; // use whatever number makes sense

请记住,当您将财产设置为“保留”时,它就是这样做的。它的合成访问器将释放旧分配并保留新分配。因此,如果您直接为其分配一个分配的实例,该实例将被保留两次,从而造成内存泄漏。*

*编辑:请参阅下面的 deanWombourne 评论。alloc] init] autorelease因为直接分配给保留属性不会造成内存泄漏。但我仍然不相信它是内存效率的。

于 2012-04-05T12:44:05.410 回答