iOS: переменная экземпляра в блоке

Мой объект имеет некоторую переменную экземпляра, например:

@interface MyObject : NSObject 
{
@private 
    NSDictionary * resultDictionary ;
}

это метод:

- (void) doSomething
{
    __weak typeof(self) weakSelf = self ;

    [TaskAction invoke:^(NSDictionary* result){
        if(result){
            weakSelf->resultDictionary = result ; // dereferencing a weak pointer is not allowed due to possible null value caused by race condition , assign it to strong variable first ...
        }
    }]
}

компилятор iOS выдает ошибку: // разыменование слабого указателя не разрешено из-за возможного нулевого значения, вызванного состоянием гонки, сначала назначьте его сильной переменной...

оператор ошибки: weakSelf->resultDictionary = result;

Не могли бы вы помочь мне, почему ошибка.


person user5465320    schedule 20.10.2015    source источник


Ответы (1)


На самом деле вам не нужна слабая ссылка в этом коде. Здесь нет риска повторного цикла.

Однако, если бы вы это сделали, решением было бы создать свойство для частного ивара. Затем вы можете получить доступ к свойству через слабый указатель внутри блока.

Дополнительное примечание: не помещайте частные ивары в общедоступный интерфейс. Нет веской причины размещать личные данные в общедоступном интерфейсе. Поместите частный ivar (или частное свойство) в расширение частного класса в файле .m.

.h файл:

@interface MyObject : NSObject
@end

.м файл:

@interface MyObject()

@property (nonatomic, strong) NSDictionary *resultDictionary;
@end

@implementation MyObject

- (void)doSomething {
    [TaskAction invoke:^(NSDictionary* result){
        if (result){
            self.resultDictionary = result;
        }
    }];
}

@end
person rmaddy    schedule 20.10.2015
comment
На мой взгляд, вы не правы. 1. Если создать свойство, статус ивара не будет частным. 2. В блоке мы не можем использовать self, указатель «self» является сильным указателем. - person user5465320; 20.10.2015
comment
Нет, это частная собственность. Он определен в расширении частного класса. И в этом случае нет ничего плохого в сильной ссылке на себя. Референтного цикла нет. Попробуй это. - person rmaddy; 20.10.2015
comment
Им не нужно использовать свойство — они могут использовать ивар, если захотят; хотя я согласен с тем, что ивар должен быть объявлен в расширении или реализации, а не в интерфейсе. - person newacct; 21.10.2015
comment
@newacct Да, вы можете получить доступ к ivar, используя сильный self. Но вы не можете получить доступ к ivar через слабый self. Я предложил свойство из-за оригинального использования слабого self. Затем я понял, что код вообще не нуждается в слабом указателе. - person rmaddy; 21.10.2015