Поскольку никто, похоже, не заметил: Там может быть утечка.
я буду считать, что foo
является как Ивар и 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;
Помните, что использование свойств в dealloc обычно обескураживается в случае изменения метода доступа для изменения другого ivar (который уже мог быть выпущен). Вместо этого я использую release. –
@Alex: +1 за отличное предупреждение, но -1 за предложение использовать self.foo = nil в методе dealloc! –
@eJames self.foo = nil - это то, как Apple рекомендовала делать это в методе dealloc изначально и повсюду в своем примере кода. –