@interface Foo : NSObject
@property (nonatomic, retain) Bar * bar;
@end
@implementation Foo
@synthesize bar = _bar;
- init {
self = [super init];
if (self) {
_bar = [[Bar alloc] init];
// Or
_bar = [[[Bar alloc] init] autorelease];
}
return self;
}
- (void)dealloc {
[_bar release];
[super dealloc];
}
@end
When I run the analyzer, both
_bar = [[Bar alloc] init];
and
_bar = [[[Bar alloc] init] autorelease];
are fine.
Which one I should use?
You should use the first. It creates a retained object, whereas the second “autoreleases” that retain.
The important consideration is that you’re assigning it to instance variable _bar. If you were, instead, assigning it to property
self.bar, then theretaindirective in the property declaration would cause the object to be retained, so assigning an autoreleased value would be appropriate. But since you’re assigning to the “bare” instance variable instead, you need to handle the retain yourself, so you need the first form.PS: I’m a bit surprised that the analyzer doesn’t complain about the second version.
PPS: It should be noted that the choice here is highly context dependent. But you included enough context (the property definition) to make the choice. Without seeing the property definition (or other info, in the case of a non-property) it would be hard to say.