Recently someone on Stack Overflow told me that the code below does not leak, that the property handles retention itself:
self.locationManager = [[CLLocationManager alloc] init];
in dealloc :
self.locationManager = nil;
where in the .h file:
@property (nonatomic, retain) CLLocationManager *locationManager;
I thought that was an obvious leak and believed this should fix the leak:
self.locationManager = [[[CLLocationManager alloc] init] autorelease];
However he claimed that would not work, because in his words : “you don’t autorelease properties of a class. The autogenerated accessor of a property defined to retain will handle retention automatically”
And he made me wonder if he is wrong or have I not understood memory management at all?
EDIT 1: Is the code
self.myName=[NSSting stringWithFormat:@"%@ is correct.", @"TechZen"];
any different than
self.locationManager = [[[CLLocationManager alloc] init] autorelease];
memory management-wise?
The guy says the first one is correct and refuses the second one. Why would the second one be SO WRONG? As far as I can see both assign autoreleased instances to some properties, but somehow there’s still a stubborn argument that second one is wrong. I cannot see it, any help would be so welcome.
Counting retains and releases helps in this case. It is most definitely a leak. Your
locationManagerobject will be retained 2 times: once by thealloc/initcalls, and once by the property. Setting the property tonilwill only release thelocationManageronce.For the examples given in Edit 1, they are indeed the same. It sounds like the other developer has an aversion to immediately autoreleasing or doesn’t quite understand what
autoreleasedoes.