Я спрашиваю, потому что я занимался сложным блочным кодом, и я не ожидал, что следующий код будет работать правильно.Какие типы данных имеют ivars для примитивных свойств?
Скажем, у нас есть свойство BOOL, как это:
@property (nonatomic, assign) BOOL isCancelled;
Это автоматический синтезирован, нет пользовательских добытчик, не сеттер, никаких явных Ивар.
Тогда есть этот код ... который отлично работает
dispatch_async(queue, ^{
id result = block(&_isCancelled);
if (!_isCancelled) { ... }
}
Однако, я бы ожидал, что он работает для блока() вызов, но не для, если, где я думал, что это будет захватить значение _isCancelled и сохранить его const, а не изменять его во время исполнения. Тем не менее, во время выполнения значение _isCancelled всегда согласовано внутри/вне блока, как если бы оно было фактически BOOL *
Может ли кто-нибудь объяснить, что происходит?
В данном коде не используется какое-либо свойство, '_isCancelled' является нормальным * ivar *, хотя и объявлено неявным образом. – Sulthan
Согласен, но поскольку он не объявлен явно, я мог предположить, что он будет объявлен как указатель вместо примитива. Это может объяснить поведение (если я что-то не хватает) – CatalinM
Тип свойства совпадает с типом поддержки ivar. Объявление свойства 'BOOL isCancelled' означает, что будет синтезирован ivar' BOOL _isCancelled'. Это все. – Sulthan