2015-10-20 4 views
0

My Object есть переменная экземпляра, например: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;

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

ответ

2

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

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

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

.h файл:

@interface MyObject : NSObject 
@end 

.m файл:

@interface MyObject() 

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

@implementation MyObject 

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

@end 
+0

По-моему, вы не правы. 1, Если создать свойство, статус ivar не будет закрытым. 2, в блоке мы не можем использовать self, указатель «self» является сильным указателем – user5465320

+1

Нет, свойство является приватным. Он определен в расширении частного класса. И нет ничего плохого в сильной ссылке на себя в этом случае. Нет никакого эталонного цикла. Попробуй. – rmaddy

+0

Им не нужно использовать имущество - они могут использовать ивар, если они этого захотят; хотя я согласен с тем, что ivar должен быть объявлен в расширении или реализации, а не в интерфейсе. – newacct

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

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