2016-11-22 34 views
0

所以我有以下代码:在块内分配一个变量需要弱引用?

[serviceHandler getHomeConfigurationData:^(NSDictionary *data){ 
     if (data) { 
      NSLog(@"The Data: %@", data); 
      homeConfigData = data; 
     } 
    } failure:^(NSError *error, BaseServiceHandler *context){ 
     homeConfigData = Nil; 
     NSLog(@"Error: %@", error); 
    }]; 
在这里

homeConfigData是我的ViewController一个实例变量。整个方法在后台线程上完成。一旦完成块返回/被触发,ViewController可能会被释放。所以我很担心,如果我在线路上遇到问题时homeConfigData = data;

我该如何处理?

回答

0

像这样:

YourClass *__weak weakSelf = self; 

[serviceHandler getHomeConfigurationData:^(NSDictionary *data){ 
    if (data) { 
     NSLog(@"The Data: %@", data); 
     weakSelf.homeConfigData = data; 
    } 
} failure:^(NSError *error, BaseServiceHandler *context){ 
    weakSelf.homeConfigData = Nil; 
    NSLog(@"Error: %@", error); 
}]; 

如果所有强指向自我成为零的,实例将被释放,所有的弱指针,即weakSelf,将成为零。发送setHomeConfigData选择器为零将是一个noop。

+0

如果weakSelf变成零,我们得到Nil = data。这是否会导致崩溃? 另外,我是否正确地假设我应该这样做? 另外我不能做weakSelf.homeConfigData,因为“homeConfigData”是一个实例变量 – user1416564

+0

我没有关注你的担忧。 weakSelf应该是一个指向实例的指针,所以使用一个实例变量不应该成为问题。 'data'不会是零,但'weakSelf.homeConfigData = data'将是一个空操作,因为'weakSelf'将是零。如果您还有其他问题,请发布更多代码。 –

+0

好的,让我再试一次。 'homeConfigData'是一个私有变量。这意味着你不能执行'self.homeConfigData'。它不会编译。无论如何,我设法找出一个解决方案,并在前面使用'__block'声明'homeConfigData'。 – user1416564

1

一旦 完成块返回/被激发,ViewController可能会被取消分配。

实际上,因为它现在写的,它是可能的是,的ViewController由时间释放该块的运行,因为这两个块的保留selfself在两个块中被使用(因为实例变量homeConfigData被使用,其隐含地意味着self->homeConfigData)。

+0

有趣。因此,如果'getHomeConfigurationData'方法(这是一个方法调用)需要1分钟的时间才能触发并且包含ViewController,那么它就没有机会被释放了。 – user1416564

+1

@ user1416564:是的 – newacct