什么时候使用Self?

时间:2012-11-30 15:05:04

标签: objective-c cocoa-touch self

我是iOS开发的新手。

我的财产如下,

@property(nonatomic,retain)NSMutableArray *dataArray;

我正在做以下事情,将其分配

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

在dealloc我正在做以下

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

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

当我不使用自己时,

泄漏。但我想知道它是一种初始化数组的写入方法

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

3 个答案:

答案 0 :(得分:1)

您正在收到泄漏,因为dataArray属性是使用retain声明的,这意味着当您使用self时(因此您使用setter),您的保留计数最多为2,并且您只释放一次。另一方面,如果你只使用ivar,保留计数是1(因为alloc)你释放一次,这很好。为了避免在第一种情况下发生内存泄漏,请自动释放它。

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

这将平衡保留计数。至于访问,除了dealloc方法内部,尝试使用self(setter和getter)

你应该阅读内存管理文档,首先要开发Cocoa Touch。

另外,为什么不使用ARC?

答案 1 :(得分:1)

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

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

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

或:

_dataArray = [[NSMutableArray alloc] init];

答案 2 :(得分:0)

这里发生的是alloc正在为新对象的保留计数添加一个。属性引用也保留对象。如果你想这样做,你只想要其中一个。一种常见的方法是:

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

然而,更好的是使用ARC作为@ c.cam108建议并避免整个问题。