0

比如说,我有一个UIView我声明的类型的类(比如“MyClass”),一个(nonatomic, strong)类委托类型的属性,用于处理事件将由该类触发。

应用程序启用了 ARC,它工作得很好,有一次我发现了一些有趣的东西,我在我的一个视图控制器(比如 TempViewController)中放置了一个 dealloc,我在其中设置了 to 的MyClass委托self。每当我从 TempViewController 弹出时,它应该调用它的 dealloc 方法,但事实并非如此。我不知道为什么,但不是,我为其他类放置了deallocs,它们都被调用了。

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

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

我发现的另一种解决方案是,通过设置MyClassnilviewDidDisappear委托(就像我们为MKMapViewor所做的那样UIWebView),它将为同一个 TempViewController 类调用 dealloc。

是什么导致了问题?任何帮助,建议?

4

3 回答 3

2

这也意味着您仍然持有或引用另一个类的属性,编译器无法调用该类的 dealloc 方法。如果你完成了,你要么将它设置为 nil,要么给它分配一个弱引用。尝试阅读此答案

于 2013-12-30T10:01:30.483 回答
1

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

@property (nonatomic, weak) id<yourprotocol> delegate;
于 2013-12-30T09:54:45.710 回答
1

如果您为您的委托提供强大的属性,它将增加保留计数。当您从导航队列中弹出时,它也会减少保留计数。因此,即使you pop您的视图控制器,它也通过委托保留计数(如果强)。您的 dealloc 仅在保留计数为 0 时才被调用

注意:当您设置nil为 Disappear 中的委托时,您分配的委托decrease保留计数,setter method并将 nil 分配给委托。这就是为什么当设置为零时它会被调用。

所以你可以weak像这样声明你的委托

@property (nonatomic, weak) id<Protocol> delegate;
于 2013-12-30T09:57:07.100 回答