- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我登录时,我从 VC1 通过 segue 调用 VC2
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if ([[segue identifier] isEqualToString: @"embeddedVC2"]) {
self.VC2 = [segue destinationViewController];
self.VC2.delegate = self;
}
}
我在 VC1 中有 dealloc
-(void)dealloc{
self.VC2.delegate=nil;
}
VC2中的delegate声明为(nonatomic,assign)
在 VC2 中,我正在执行下载操作,当它完成时我正在调用
[self.delegate downloadFinish:self.downloadData];
问题是当下载完成时,VC1 中的 dealloc 被调用,并且它使 VC2 中的委托(delegate)为 nil。所以委托(delegate)为零,[self.delegate downloadFinish:self.downloadData];不起作用。
如果我在 VC1 dealloc
方法中删除 self.VC2.delegate=nil
,那么我会得到异常在行:
[self.delegate downloadFinish:self.downloadData];
发送到解除分配实例的消息:因为 VC1 已解除分配,我无法对其执行任何操作。
处理这种情况的正确方法是什么?
注意:这只会在我再次重做该过程时发生。
案例 1:登录 -> VC1 ->VC2 工作正常,委托(delegate)通知我下载完成
情况 2:VC1 中没有 dealloc 方法:
login -> VC1 -> VC2 -> logout ->login -> VC1 -> VC2 (boom) crash-message sent to deallocated instance
案例 3:在 VC1 中使用 dealloc 并在其中使用 self.VC2.delegate=nil:
login -> VC1 -> VC2 -> logout ->login -> VC1 -> VC2 没有任何反应,因为 delegate 被设置为 nil
我尝试使用 Zombie instrument,但我一点也不明白。我被长长的堆栈跟踪弄糊涂了,看引用计数和保留计数数字时迷路了。如果您需要,我可以在仪器中发布 stacktract。
编辑:
我将委托(delegate)更改为 nonatomic
和 weak
并删除了 dealloc
方法。
当我通过 segue 加载 VC2
时,VC2 委托(delegate)在 viewDidLoad
中不是 nil,但它变成了 nil
下载完成,此时我还在VC2中。我想知道是什么让委托(delegate)为零,因为我没有转到另一个 VC。
最佳答案
确保您要么推送一个 VC,呈现一个 VC,要么添加为 childViewController,这样父级就不会被释放。否则,如果您正在使用 tabbar,则需要确保 VC1 永远不会设置为 nil。
如果您花太多时间尝试解决它,我会重写您将 VC 添加到层次结构的方式。
关于ios - 如何为案例 : Message sent to deallocated instance 设置委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37601347/
我是一名优秀的程序员,十分优秀!