我想在我的代码中获得一些内存泄漏,如何修复内存泄漏。
dashboard = [[NSMutableArray alloc] init];
[dashboard addObject:[[NSDictionary alloc] initWithObjectsAndKeys:@"demo_1.jpg",@"pic_source",@" Head",@"Title",nil]; // memory leaks here.
if ( theConnection ) {
receiveData = [[NSMutableData data] retain]; //memory leaks here.
}
但我已经发布了dealloc - in [receiveData release] ;,但发生了内存泄漏。我知道保留,计数增加,但我怎样才能正确发布数据。
谢谢!
答案 0 :(得分:2)
dashboard addObject:[[NSDictionary alloc] initWithObjectsAndKeys:@"demo_1.jpg",@"pic_source",@" Head",@"Title",nil];
您调用了init方法 - 然后您就是对象的所有者。当你把它放到数组中时 - 也会调用retain。只需调用autorelease来修复泄漏。
receiveData = [[NSMutableData data] retain];
- 如果您将调用release
,则超出范围时将删除此对象。如果你要写
receiveData = [NSMutableData data];
超出范围时会自动删除
修改强>
如果您使用的是带有init
字词的方法,那么您就是这些对象的所有者,在您对它们调用release
方法之前,它们不会自动删除。如果您不想拥有该对象,请使用一些静态方法创建它。例如:
NSMutableArray *array = [NSMutableArray arrayWithObjects: ... , nil];
与调用
相同NSMutableArray *array = [[[NSMutableArray alloc] initWithObjects: ... , nil] autorelease];
Autorelease表示对象在超出范围时将收到release
方法 - 如果未保留,将自动删除
答案 1 :(得分:2)
我认为你的泄密:
[dashboard addObject:[[NSDictionary alloc] initWithObjectsAndKeys:@"demo_1.jpg",@"pic_source",@" Head",@"Title",nil];
将其更改为
[dashboard addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"demo_1.jpg",@"pic_source",@" Head",@"Title",nil];
addObject保留了对象,因此您可以使用便利创建方法来自动释放它们创建的对象。
和另一个可能的泄漏...如果您将receiveData定义为具有retain属性的属性,则无需显式调用retain。你可以致电self.recieveData = [NSMutableData data]
。这将保留它。当然,你仍然需要在dealloc中发布它。
编辑以显示代码:
NSMutableArray *anArray = [[[NSMutableArray alloc] init] autorelease];
[sections setValue:anArray forKey:display_date];