开发者

What would be a proper way to initialize a instance variable in Objective C without leaking memory?

I have a class like this:

@interface MyCollection : NSObject {
    NSMutableDictionary *data;
}

and in the implementation of it, I have a method to init it like this:

- (id) init {
    if(self = [super init])
    {
        self.data = [[NSMutableDictionary alloc] init];
    }
    return self;
}

Now when I create a object of this class in my code like this:

MyCollection *c = [[MyCollection alloc] init];

... at which point the Leaks utility shows that I have a memory leak in the init function on the very line where I try to set up the instance variable. I am totally new to Objective C &a开发者_运维技巧mp; Iphone and I can't just get what is going wrong here. I have read through the Memory Management Guide and all, but I think I'm missing something pretty serious here.

Any help would be greatly appreciated. Thanks for your time already.


you are using self.data =. So there is most likely a property. And it most likely is a property which either copies or retains your object if you use it.
By calling

 self.data = [[NSMutableDictionary alloc] init];

The retain count of the NSMutableDictionary increases because of the alloc, and if the property of data has a retain or copy statement you get another increase in retain count.

you could write data = [[NSMutableDictionary alloc] init]; or self.data = [NSMutableDictionary dictionary]. This would increase the retain count only one time.

And don't forget to release the object in dealloc.


You have to release the object in your dealloc method. That's why it's showing up as a leak.


to add to what fluchtpunkt mentioned you could try this instead:

- (id) init {
    if(self = [super init])
    {
        self.data = [NSMutableDictionary dictionaryWithCapacity:0];
    }
    return self;
}

and in the dealloc

-(void)dealloc
{
  self.data = nil;
}


I see weird situations with the Leaks utility as sometimes it reports old leaks, sometimes it doesn't report new ones, and so on. Also, from what I could collect with all your answers and opinion elsewhere on the web, people are divided on whether one should set a pointer to nil or not. As of now, I have solved the situation with the following approach.

- (id) init {
    if(self = [super init])
    {
        data = [[[NSMutableDictionary alloc] initWithCapacity:0];
    }
    return self;
}

-(void)dealloc
{
    [data release];
}

Thanks everyone for contributing.


Are you creating the instance of "MyCollection" in the interface section?

If it has method scope try to release it in the same method after you are done with it.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜