Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa touch 在解除锁定之前,对正在解除锁定的对象的弱引用为nil_Cocoa Touch_Cocoa_Memory Management_Automatic Ref Counting - Fatal编程技术网

Cocoa touch 在解除锁定之前,对正在解除锁定的对象的弱引用为nil

Cocoa touch 在解除锁定之前,对正在解除锁定的对象的弱引用为nil,cocoa-touch,cocoa,memory-management,automatic-ref-counting,Cocoa Touch,Cocoa,Memory Management,Automatic Ref Counting,假设B对A有弱引用,A对B有强引用 在A的解除锁定中 - (void)dealloc { [self.b foo]; self.b = nil; } 在B的foo中 - (void)foo { NSLog(@"%@", self.a); //using self.a weak reference to A, which is nil; } 为什么dealloc完成后弱引用不是nil?原因是什么?我能阻止它吗?是否有可能在dealloc之前调用某个方法?两

假设B对A有弱引用,A对B有强引用

A的解除锁定中

- (void)dealloc {

    [self.b foo];
    self.b = nil;

}
B的foo中

- (void)foo {

   NSLog(@"%@", self.a);
   //using self.a weak reference to A, which is nil; 

}
为什么dealloc完成后弱引用不是nil?原因是什么?我能阻止它吗?是否有可能在dealloc之前调用某个方法?

两个不一致之处:

1.A)您在代码中声明:

。。。对A的弱引用,它为零

1.B)在你的问题中,你陈述:

…为什么弱引用不是零

根据上文第1.A)段,该值与预期值一样为零


2.A)你在问题中陈述

…在解除锁定后

2.B)在代码中,您在dealloc方法中调用函数
foo


dealloc完成后不执行Foo。一旦您从Dealloc方法返回,就会完成Dealloc。另外,您没有调用
[super dealloc]
,如果使用ARC,这是可以的,但是如果您没有使用自动引用计数,它将丢失。

但是当A调用B的foo时,B在A上的弱指针已经为零,甚至当A的dealloc没有完成Yet时,当调用dealloc时,A终止所有指向自身的弱指针,虽然它仍然有自己的强指针。是的,但如何避免。。。或者有没有一个方法在dealloc之前被调用,其中弱引用一个dont hold nil?弱引用并不意味着责任或所有权。因此,你永远不能指望它不是零。请参见此。可能的副本