iOS:如果强委托设置为self,则不会调用dealloc

时间:2013-12-30 09:46:02

标签: ios delegates dealloc strong-references

说,我是一个类UIView的类(我说是“MyClass”),我声明了一个类(nonatomic, strong)的属性,用于类委托,处理事件将由类激活。 / p>

应用程序启用了ARC,它运行得很好,有时候我发现了一些有趣的东西,我在我的一个视图控制器(Say TempViewController)中放了一个dealloc,我将MyClass的委托设置为{{ 1}}。每当我从TempViewController弹出时,它应该调用它的dealloc方法,但事实并非如此。我不知道为什么,但不是,我把deallocs放到其他课程,然后他们都被调用了。

然后我发现,它没有在TempViewController中调用,因为我已经设置了MyClass委托。我也用其他类测试它,然后它停止调用dealloc。

稍后我更改,将属性委托给self而不是assign,尽管它再次正常工作。

我找到的另一个解决方案是,在strong中为MyClass的代表设置nil(就像我们为viewDidDisappearMKMapView所做的那样),它会调用dealloc用于相同的TempViewController类。

导致问题的原因是什么?任何帮助,建议?

3 个答案:

答案 0 :(得分:2)

这也意味着您仍然持有或引用Another类的属性,并且编译器无法为该类调用dealloc方法。它要么你把它设置为nil,要么你完成或指定一个弱引用。尝试阅读此answer

答案 1 :(得分:1)

这是因为您将该属性声明为strong,将其更改为weak

@property (nonatomic, weak) id<yourprotocol> delegate;

答案 2 :(得分:1)

如果您向代表提供强大的财产,则会增加保留计数。当您从导航队列中弹出时,它也会减少保留计数。因此,即使you pop您的视图控制器,它也通过委托保留计数(如果强大)。 只有在保留计数为0

时,您的dealloc才会被调用

注意:当您在“消失”中将nil设置为委派时,您指定的代理decrease会通过setter method保留计数,并将nil指定给委托。这就是为什么,当设置为nil时它会调用。

因此,您可以声明自己委托为weak,就像

一样
@property (nonatomic, weak) id<Protocol> delegate;