我是iOS开发的新手。
我的财产如下,
@property(nonatomic,retain)NSMutableArray *dataArray;
我正在做以下事情,将其分配
self.dataArray=[[NSMutable alloc]init];
在dealloc我正在做以下
-(void)delloc{
[dataArray release];
[super dealloc];
}
但我的数组初始化会导致内存泄漏。但是,它不会创建
当我不使用自己时,泄漏。但我想知道它是一种初始化数组的写入方法
不使用自我。任何帮助表示赞赏。
答案 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建议并避免整个问题。