The Leaks instrument tells me that I have a memory leak when I use decodeObjectForKey
within initWithCoder
. For example:
Class.h
{
MyObject *myObject;
}
@property (nonatomic, retain) MyObject *myObject;
Class.m
@synthesize myObject
-(void)dealloc{
[myObject release];
[super release];
}
-(id)initWithCoder:(NSCoder *)decoder{
if (self = [super init]{
self.myObject = [decoder decodeObjectForKey:@"MyObject"];
}
return self;
}
Per request in the comments:
-(void)encodeWithCoder:(NSCoder *)encoder{
[encoder encodeObject:myObject forKey:@"MyObject"];
}
Leaks reports a leak of type NSCFString on the line;
self.myObject = [decoder decodeObjectForKey:@"MyObject];
As I understand it, decodeObjectForKey returns an autoreleased object. Since I immediately assign that value to the myObject property, which is specified as (nontoxic, retain) in the property definition, I retain the autoreleased object through the setter method of the myObject property. The myObject is then released in the dealloc method. I don't understand where the leak is if I understand the sequence correctly. Also why is it reported as a NSCFString when the type is MYObject?
Any thoughts would be appreciated, including if my assumptions above are correct.
Look carefully at your -dealloc
method. You are calling [super release];
when you should be calling [super dealloc];
.
Calling [super release]
in this case is the same thing as calling [self release]
, since you're not overriding the -release
method. If your -dealloc
method is called, your object has already been fully released, so this is unnecessary. Since you are overriding the -dealloc
method, you must call [super dealloc]
to also free any memory allocated by the superclass.
You can refer to the NSObject documentation to see how to override dealloc correctly.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.