说,我是一个类UIView
的类(我说是“MyClass”),我声明了一个类(nonatomic, strong)
的属性,用于类委托,处理事件将由类激活。 / p>
应用程序启用了ARC,它运行得很好,有时候我发现了一些有趣的东西,我在我的一个视图控制器(Say TempViewController)中放了一个dealloc,我将MyClass
的委托设置为{{ 1}}。每当我从TempViewController弹出时,它应该调用它的dealloc方法,但事实并非如此。我不知道为什么,但不是,我把deallocs放到其他课程,然后他们都被调用了。
然后我发现,它没有在TempViewController中调用,因为我已经设置了MyClass委托。我也用其他类测试它,然后它停止调用dealloc。
稍后我更改,将属性委托给self
而不是assign
,尽管它再次正常工作。
我找到的另一个解决方案是,在strong
中为MyClass的代表设置nil
(就像我们为viewDidDisappear
或MKMapView
所做的那样),它会调用dealloc用于相同的TempViewController类。
导致问题的原因是什么?任何帮助,建议?
答案 0 :(得分:2)
这也意味着您仍然持有或引用Another类的属性,并且编译器无法为该类调用dealloc方法。它要么你把它设置为nil,要么你完成或指定一个弱引用。尝试阅读此answer
答案 1 :(得分:1)
这是因为您将该属性声明为strong
,将其更改为weak
。
@property (nonatomic, weak) id<yourprotocol> delegate;
答案 2 :(得分:1)
如果您向代表提供强大的财产,则会增加保留计数。当您从导航队列中弹出时,它也会减少保留计数。因此,即使you pop
您的视图控制器,它也通过委托保留计数(如果强大)。 只有在保留计数为0
注意:当您在“消失”中将nil
设置为委派时,您指定的代理decrease
会通过setter method
保留计数,并将nil指定给委托。这就是为什么,当设置为nil时它会调用。
因此,您可以声明自己委托为weak
,就像
@property (nonatomic, weak) id<Protocol> delegate;