Цель C стрелка (->) указатель безопасности - PullRequest
0 голосов
/ 09 июня 2019

Чтобы избежать захвата «я» в блоке, мы часто используем слабый указатель. Однако для некоторых 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 с помощью средства доступа со стрелкой (->)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...