Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在不泄漏内存的情况下,初始化Objective C中的实例变量的正确方法是什么?_Objective C_Iphone Sdk 3.0_Memory Leaks - Fatal编程技术网

Objective c 在不泄漏内存的情况下,初始化Objective C中的实例变量的正确方法是什么?

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]

我有一门课是这样的:

@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完全陌生,我不知道这里出了什么问题。我已经通读了《内存管理指南》和所有内容,但我认为我遗漏了一些非常严重的东西


任何帮助都将不胜感激。谢谢您的时间。

您必须用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