-2

我是 iOS 开发的新手。

我有以下财产,

@property(nonatomic,retain)NSMutableArray *dataArray;

我正在执行以下操作来分配它

self.dataArray=[[NSMutable alloc]init];

在 dealloc 中,我正在执行以下操作

-(void)delloc{
  [dataArray release];
  [super dealloc];
}

但是我的数组初始化出现内存泄漏。但是,它不会创建

当我不使用 self 时泄漏。但我想知道它是一种初始化数组的写方法

不使用自我。任何帮助表示赞赏。

4

3 回答 3

1

因为 dataArray 属性是用 retain 声明的,所以你得到了一个泄漏,这意味着当你使用 self(因此你使用 setter)时,你的保留计数上升到 2 并且你只释放它一次。另一方面,如果您只使用 ivar,则保留计数为 1(因为分配)并且您释放它一次,这很好。为了避免第一种情况下的内存泄漏,像这样自动释放它。

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

这将平衡保留计数。至于访问,除了dealloc方法里面,尽量用self(setter和getter)

您应该阅读内存管理文档,这是为 Cocoa Touch 开发时首先要开始的事情。

另外,你为什么不使用ARC?

于 2012-11-30T15:15:18.240 回答
1

如果您使用self.通过自动生成/自定义 getter/setter 访问对象的签名。设置器通常会管理内存,您不需要这样做。如果您不使用 self 您可以直接访问该对象。

您提供的代码正在泄漏,因为 的默认设置器dataArray将保留到数组中,您设置self.dataArray = [[NSMutableArray alloc] init]; 的正确用法是:

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

或者:

_dataArray = [[NSMutableArray alloc] init];
于 2012-11-30T15:16:09.927 回答
0

这里发生的事情alloc是将新对象的保留计数加一。属性引用也保留了对象。如果你想这样做,你只想要其中之一。一种常见的方法是:

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

但是,最好还是按照@c.cam108 的建议使用 ARC 并避免整个问题。

于 2012-11-30T15:16:43.673 回答