objective-ciphonememoryautorelease

How to protect objects from autorelease?


Finally the objective-c memory management caught me. I'm fighting with a problem now for 2 days. I´m new to Objective C and can't solve the problem by my own. Seems like I am unknowingly overreleasing an Object. If I´m doin the zombie analysis I´m getting the "An Objective-C message was sent to a deallocated object.."

This is the important part of the Analysis Log I guess: The last line with RefCt -1 shows the responsible caller is -[XClass dataset]

dataset is a NSDictionary that I use to store data of every object. Im Using the Dictionary in two extern classes by using the 2 methods of XClass ("updateDictionary:" and "dict:")

The Declaration of the File:

XClass.h:  
...  
NSDictionary* dataset;    
...  
@property (retain) NSDictionary *dataset;  
- (id)initWithDeviceValue:(NSDictionary*)DataSet  
- (void) updateDictionary:(NSDictionary *)dict;
- (NSDictionary *)dict;
XClass.m:

@synthesize dataset;  

-(id)initWithDeviceValue:(NSDictionary*)DataSet{  
..  
if (self = [super init])  
{  
      dataset = DataSet;}  
}  
return self;  
}    
- (void) updateDictionary:(NSDictionary *)dict{  
    dataset=[NSDictionary dictionaryWithDictionary:dict];  
}  

-(NSDictionary *)dict{  
    return dataset;  
}  

The first extern method calling the (dict:) function gets the actual dictionary correctly. The second function doesn't get the dictionary because it seems to be released!

Like I said the last line of the zombie log is:

Malloc: Zombie RefCt: -1 Responsible caller is -[XClass dataset]

The former interesting lines:

Line 2 of the Zombielog:

Malloc:CFRetain RefCt:2 Responsible Caller:-[XClass dataset]

Line 3 of the Zombielog:

Malloc:Autorelease RefCt:empty Responsible Caller:-[XClass dataset]

It seems like the dictionary of my object got autoreleased. Maybe because it had the RefCt (retain count?) of 2 which was too much and so got autoreleased? How can I prevent objects from being autoreleased?


Solution

  • XClass.m: try this ...

    @synthesize dataset;  
    
    -(id)initWithDeviceValue:(NSDictionary*)DataSet{  
        ..  
        if (self = [super init])  
        {  
              self.dataset = DataSet;
        }  
        return self;  
    }    
    - (void) updateDictionary:(NSDictionary *)dict{  
        self.dataset=[NSDictionary dictionaryWithDictionary:dict];  
    }  
    
    -(NSDictionary *)dict{  
        return dataset;  
    }