Поскольку никто, кажется, не заметил: Там может быть утечка.
Я предполагаю, что foo
является одновременно свойством ivar и retain
:
@interface Foo : NSObject {
NSObject * foo;
}
@property (nonatomic, retain) NSObject * foo;
@end
Допустим, ваш код выглядит примерно так:
-(void)bar {
foo = [[NSObject alloc] init];
self.foo = nil;
}
То, что само по себе не протекает при условии, что foo
было нулем, чтобы начать с . Это не значит, что он не протечет - допустим, вы добавили еще немного кода:
-(void)baz {
self.foo = [[NSObject new] autorelease];
}
-(void)fubar {
[self baz];
[self bar];
}
Такие вещи, как foo = [[Foo alloc] init]
, обычно безопасны в init
-методах, поскольку предполагается, что вы вызываете только один из них, поэтому foo
гарантированно будет nil
изначально В любом другом месте вы должны быть немного осторожнее.
// Use assertions so it crashes debug builds if it's already set
assert(!foo);
foo = [[NSObject alloc] init];
self.foo = nil;
// Or release explicitly.
[foo release];
foo = [[NSObject alloc] init];
self.foo = nil;
// Or just use the setter, which will do the "right thing".
// This is particularly relevant for "copy" or "assign" accessors.
self.foo = [[[NSObject alloc] init] autorelease];
self.foo = nil;