Чтобы избежать захвата «я» в блоке, мы часто используем слабый указатель. Однако для некоторых ivars «не из свойств» (в этом примере otherValue):
@implementation MyClass
{
NSString *otherValue;
}
Нам нужен сильный ref и аксессор со стрелкой (->), который обычно делается так:
MyClass *blockself = weakself;
blockself->otherValue
Проблема в том, что доступ к blockself->otherValue
завершится сбоем, если blockself
равен нулю.
Я могу проверить if (blockself)
, но он «может» быть освобожден сразу после следующей строки.
Пример:
__weak MyClass *weakself = self;
[serverManager runSomething:^(Result *res) {
// If pointer (weakself) is released, no problem. Accessing though a 'property'
if (weakself.value) {
}
// For local iVars though:
MyClass *blockself = weakself;
// This will crash if 'blockself' is nil
if (blockself->otherValue) {
}
// Can test for nil here
if (blockself) {
// But..
// Potentiall, the pointer 'could' be released here
if (blockself->_value) {
}
}
Итак, единственный ли более безопасный способ - перейти с iVars на использование @property
? Существует ли «безопасный» способ доступа к iVars с помощью средства доступа со стрелкой (->
)?