Objective c 什么时候使用Self?

Objective c 什么时候使用Self?,objective-c,cocoa-touch,self,Objective C,Cocoa Touch,Self,我是iOS开发新手 我有如下财产: @property(nonatomic,retain)NSMutableArray *dataArray; 我正在做下面的事情,来分配它 self.dataArray=[[NSMutable alloc]init]; 在dealloc中,我将执行以下操作 -(void)delloc{ [dataArray release]; [super dealloc]; } 但是我的数组初始化出现内存泄漏。但是,它不会创建 当我不使用self时泄漏。但我想知

我是iOS开发新手

我有如下财产:

@property(nonatomic,retain)NSMutableArray *dataArray;
我正在做下面的事情,来分配它

self.dataArray=[[NSMutable alloc]init];
在dealloc中,我将执行以下操作

-(void)delloc{
  [dataArray release];
  [super dealloc];
}
但是我的数组初始化出现内存泄漏。但是,它不会创建

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


不使用自我。感谢您的帮助

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

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

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

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


另外,如果您使用的是通过自动生成/自定义getter/setter访问对象的
self.
签名,为什么不使用ARC?

。setter将专门管理内存,您不需要这样做。 如果不使用self,则可以直接访问对象

您显示的代码正在泄漏,因为
dataArray
的默认setter将保留到数组中,即您使用
self.dataArray=[[NSMutableArray alloc]init]设置的值
正确的用法是:

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


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

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

但是,更好的方法是按照@c.cam108的建议使用ARC,避免整个问题。

除非您需要支持iOS 3,否则我建议您切换到ARC-它将(大部分)为您节省内存管理的痛苦。至于您的问题,初始化时您正在访问属性,但释放时您正在访问关联的iVar。尝试遵守一种约定或另一种约定。当您使用
MRC
时,此约定在
-dealoc
方法中更为正确:
[self.dataArray release]
[\u dataArray release]
请注意,没有这样的对象
NSMutable
(直到您不创建一个),因此在您的情况下,我认为正确的代码是
self.dataArray=[[nsmutablerarray alloc]init]标题与内容不匹配,我强烈建议您也使用ARC,但无论如何,我建议您阅读一本“beggining objC book”(无意冒犯,但这是基本常识,不是具体问题)
self.dataArray = [[[NSMutableArray alloc]init] autorelease];