Objective c 在不泄漏内存的情况下,初始化Objective C中的实例变量的正确方法是什么?
我有一门课是这样的: @interface MyCollection : NSObject { NSMutableDictionary *data; } - (id) init { if(self = [super init]) { self.data = [[NSMutableDictionary alloc] init]; } return self; } MyCollection *c = [[MyCollection alloc] init]; @接口MyCollection:NSObject{ NSMutableDictionary*数据; } 在它的实现中,我有一个方法来初始化它,如下所示: @interface MyCollection : NSObject { NSMutableDictionary *data; } - (id) init { if(self = [super init]) { self.data = [[NSMutableDictionary alloc] init]; } return self; } MyCollection *c = [[MyCollection alloc] init]; -(id)init{ if(self=[super init]) { self.data=[[NSMutableDictionary alloc]init]; } 回归自我; } 现在,当我在代码中创建此类的对象时,如下所示: @interface MyCollection : NSObject { NSMutableDictionary *data; } - (id) init { if(self = [super init]) { self.data = [[NSMutableDictionary alloc] init]; } return self; } MyCollection *c = [[MyCollection alloc] init]; MyCollection*c=[[MyCollection alloc]init]; 。。。在这一点上,Leaks实用程序显示我在尝试设置实例变量的那一行的init函数中有内存泄漏。我对Objective C&Iphone完全陌生,我不知道这里出了什么问题。我已经通读了《内存管理指南》和所有内容,但我认为我遗漏了一些非常严重的东西Objective c 在不泄漏内存的情况下,初始化Objective C中的实例变量的正确方法是什么?,objective-c,iphone-sdk-3.0,memory-leaks,Objective C,Iphone Sdk 3.0,Memory Leaks,我有一门课是这样的: @interface MyCollection : NSObject { NSMutableDictionary *data; } - (id) init { if(self = [super init]) { self.data = [[NSMutableDictionary alloc] init]; } return self; } MyCollection *c = [[MyCollection alloc]
任何帮助都将不胜感激。谢谢您的时间。您必须用dealloc方法释放对象。这就是它显示为泄漏的原因。您使用的是
self.data=
。因此,很可能存在一个属性。如果您使用对象,它很可能是复制或保留对象的属性。打电话
self.data = [[NSMutableDictionary alloc] init];
NSMutableDictionary的retain计数因alloc而增加,如果数据的属性具有retain或copy语句,则retain计数会再次增加
您可以编写data=[[NSMutableDictionary alloc]init]
或self.data=[NSMutableDictionary]
。这将只增加一次保留计数
不要忘了在dealloc中释放对象。您是否正在接口部分创建“MyCollection”的实例
如果它有方法作用域,请尝试在使用完它后以相同的方法释放它 要添加fluchtpunkt提到的内容,您可以尝试以下方法:
- (id) init {
if(self = [super init])
{
self.data = [NSMutableDictionary dictionaryWithCapacity:0];
}
return self;
}
在dealloc
-(void)dealloc
{
self.data = nil;
}
我在Leaks实用程序中看到了奇怪的情况,因为它有时报告旧的泄漏,有时不报告新的泄漏,等等。此外,从我收集到的你在网上其他地方的所有答案和观点来看,人们对是否应该将指针设为零存在分歧。 到目前为止,我已经用以下方法解决了这个问题 - (id) init { if(self = [super init]) { data = [[[NSMutableDictionary alloc] initWithCapacity:0]; } return self; } -(void)dealloc { [data release]; } -(id)init{ if(self=[super init]) { 数据=[[NSMutableDictionary alloc]initWithCapacity:0]; } 回归自我; } -(无效)解除锁定 { [数据发布]; }
感谢大家的贡献。我确实像这样发布了对象:-(void)dealoc{[data release];data=nil;[super dealoc];}@kumar:无需在
dealloc
内部将data
设置为nil
,dealloc
是从内存中实际删除对象之前要调用的最后一个方法,因此将其设置为nil
是一个不必要的/冗余的步骤。注意,我希望删除nil分配会起作用,但它不会:(我已经尝试了您建议的所有方法,但仍然存在。我也在类的dealloc方法中释放了该对象,但没有帮助。如果您进行构建和分析,是否会收到任何消息?不,我在应用程序代码中使用了该类,并且存在泄漏。具有容量的字典是对该类的重要补充根据fluchtpunkt的说法,我使用的是数据而不是self.data