В Clang's Objective-C Automatic Reference Counting мы видим следующиеПочему настройки объекта, который проходит курс Deallocation слабых результатов собственности в аварии
Для __weak предметов, именующий обновляются, чтобы указать на новый pointee, если новый pointee не является объект в настоящее время проходит освобождение, и в этом случае lvalue обновляется до нулевого указателя. Это должно выполняться атомарно по отношению к другим назначениям объекту, чтению с объекта и окончательному выпуску нового указателя.
В objc-weak.mm дите увидеть следующий фрагмент кода в weak_register_no_lock()
:
if (deallocating) {
if (crashIfDeallocating) {
_objc_fatal("Cannot form weak reference to instance (%p) of "
"class %s. It is possible that this object was "
"over-released, or is in the process of deallocation.",
(void*)referent, object_getClassName((id)referent));
} else {
return nil;
}
}
я поставил точку останова в моем UIViewController подкласс dealloc
метод и пытался ссылаться [self allowsWeakReference]
в lldb, что привело к NO
стоимости.
Если мы попытаемся установить свойство «я» на слабое свойство другого объекта, приложение выйдет из строя в соответствии с кодом objc-weak.mm.
Вопрос в том, почему это происходит? Не соответствует ли спецификация клана? Является ли это ошибкой в реализации objc?
Вот простой фрагмент кода, который будет воспроизводить аварии:
//cc -fmodules -fobjc-arc -g crash.m -o crash
@import Foundation;
@interface Foo : NSObject
@end
@implementation Foo
- (void)dealloc {
Foo * __weak weakSelf = self; // crashes on this line
}
@end
int main() {
(void)[[Foo alloc] init];
return 0;
}
Итак, что вы хотите знать; почему ваше приложение вылетает из строя или почему установка слабого указателя на объект деаллоцирования приводит к ошибке? И почему вы предположили, что две вещи связаны? – trojanfoe
Я немного изменил свой вопрос, чтобы использовать последний источник objc-weak.mm. –
Но ты не ответил на мои вопросы. – trojanfoe