21

В 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; 
} 
+0

Итак, что вы хотите знать; почему ваше приложение вылетает из строя или почему установка слабого указателя на объект деаллоцирования приводит к ошибке? И почему вы предположили, что две вещи связаны? – trojanfoe

+0

Я немного изменил свой вопрос, чтобы использовать последний источник objc-weak.mm. –

+0

Но ты не ответил на мои вопросы. – trojanfoe

ответ

1

Это не ошибка: это, очевидно, очень преднамеренным. Это отклонение от спецификации, но оно преднамеренное.

Основываясь на предупреждении, это похоже на то, что они хотели облегчить диагностику сценариев сверхвыведения, а ловить объекты, которые были освобождены в то время, может быть просто побочным эффектом этой главной цели.

Они могли бы также рассмотреть вопрос о том, что, если вы пытаетесь weakify self, будучи высвобождены в любом случае, и вы не проверять на nil weakref (довольно часто - много блоков кода неоднократно вызывает через weakref, которые могли бы пойти nil в любое время!), вы настраиваете себя на трудные отладки ошибок.

Все, что было сказано, я хотел бы увидеть примечания, стоящие за этим изменением времени исполнения.

 Смежные вопросы

  • Нет связанных вопросов^_^