I have a CoreData NSManagedObject subclass, TextNarration, that has an attribute of type NSString, textURI. That class implements the NSCoding protocol methods: initWithCoder and encodeWithCoder this way:
- (id) initWithCoder: (NSCoder *)coder
{
if (self = [super init])
{
self.textURI = [coder decodeObjectForKey:@"textURI"];
}
return self;
}
- (void) encodeWithCoder: (NSCoder *)coder
{
[coder encodeObject:textURI forKey:@"textURI"];
}
When I create a new Instance I do something like this:
TextNarration * textNarr = [[TextNarration alloc] init];
NSString * tURI = [[NSString alloc] initWithString:[dictionaryAction objectForKey:@"narrationURI"]];
//NSString * tURI = [[NSString alloc] initWithString:@"aspa"];
textNarr.textURI = tURI;
[action_collected addObject:textNarr];
[tURI release];
[textNarr release];
Where action_collected
is an NSArray I'm going to put as transformable attribute in an entity in my model, and [dictionaryAction objectForKey:@"narrationURI"]
is an NSString previously autoreleased in another context.
How come I get a memory leak on that string and none if a use the commented line instead?
Looking at instruments it appears that the autoreleased string receives a retain
from initWithString (and encodeWithCoder
is called twice)