Я наткнулся на интересную ситуацию, когда объект мог выпустить себя, и ему было интересно, что считается безопасным и правильным в этой ситуации.
Представьте, что у нас есть класс Foo:
@implementation Foo
+ (Foo *) foo {
return [[[Foo alloc] init] autorelease];
}
- (void)resign {
[FooHolder holder].foo = nil;
// here's where the things happen
}
@end
Еще одним классом является FooHolder (синглтон с одним свойством):
@interface FooHolder : NSObject {
Foo *foo;
}
@property (retain) Foo *foo;
+ (FooHolder *)holder;
@end
И где-то в коде мы делаем это (вызывая сначала stepOne
, а затем stepTwo
; пулы авто-выпуска очищаются после завершения stepOne
):
- (void)stepOne {
Foo *foo = [Foo foo];
[FooHolder holder].foo = foo;
}
- (void)stepTwo {
[[FooHolder holder].foo resign]
}
Если я пытаюсь получить доступ к self
в методе resign
, после назначения с помощью NSZombieEnabled я получаю предупреждение о том, что self
уже освобожден.Это дает мне короткий WTF момент, но хорошо, я могу жить без доступа к self
в этой части.Что беспокоит меня больше, если объект уже освобожден, кто может гарантировать, что стек не поврежден, и мы нормально работаем с нашими локальными переменными и переменными экземпляра?В целом, является ли плохой практикой разрешать освобождение self
в методе?