iOS:如果强委托设置为self,则不会调用dealloc
比如说,我有一个iOS:如果强委托设置为self,则不会调用dealloc,ios,delegates,dealloc,strong-references,Ios,Delegates,Dealloc,Strong References,比如说,我有一个UIView类型的类(比如说“MyClass”),在这里我声明了一个(非原子,强)类型的属性,用于处理类将触发的事件 应用程序启用了ARC,并且工作正常。当我发现一些有趣的事情时,我在我的一个视图控制器(比如TempViewController)中放置了一个dealloc,在这里我将MyClass的委托设置为self。每当我从TempViewController弹出时,它都应该调用其dealloc方法,但事实并非如此。我不知道为什么,但它不是,我把其他类的交易,他们都被调用 然后
UIView
类型的类(比如说“MyClass”),在这里我声明了一个(非原子,强)
类型的属性,用于处理类将触发的事件
应用程序启用了ARC,并且工作正常。当我发现一些有趣的事情时,我在我的一个视图控制器(比如TempViewController)中放置了一个dealloc,在这里我将MyClass
的委托设置为self
。每当我从TempViewController弹出时,它都应该调用其dealloc方法,但事实并非如此。我不知道为什么,但它不是,我把其他类的交易,他们都被调用
然后我发现,它没有调用TempViewController,因为我已经设置了MyClass委托。我也对其他类进行了同样的测试,然后它停止调用dealloc
后来我更改了,将属性委托给,assign
,而不是strong
,尽管它工作正常
我发现的另一个解决方案是,通过在MyClass的委托中为其设置nil
(就像我们为MKMapView
或UIWebView
所做的那样),它将为相同的TempViewController类调用dealoc
问题出在哪里?有什么帮助和建议吗?这是因为您将属性声明为
strong
,请将其更改为弱
@property (nonatomic, weak) id<yourprotocol> delegate;
@属性(非原子,弱)id委托;
这是因为您将属性声明为strong
,请将其更改为弱
@property (nonatomic, weak) id<yourprotocol> delegate;
@属性(非原子,弱)id委托;
如果您将强属性赋予您的代理,则会增加保留计数。当您从导航队列弹出时,它也只是减少了保留计数。因此,即使您弹出视图控制器,它也通过委托保留计数(如果强)只有当保留计数为0时,您的dealloc才会收到呼叫
注意:当您将nil
设置为“委托消失”时,您分配的委托通过setter方法减少
保留计数
并将nil分配给委托。这就是为什么,当设置为零时,它会收到呼叫
因此,您可以将委托声明为弱
,如下所示
@property (nonatomic, weak) id<Protocol> delegate;
@属性(非原子,弱)id委托;
如果您将强属性赋予您的代理,则会增加保留计数。当您从导航队列弹出时,它也只是减少了保留计数。因此,即使您弹出视图控制器,它也通过委托保留计数(如果强)只有当保留计数为0时,您的dealloc才会收到呼叫
注意:当您将nil
设置为“委托消失”时,您分配的委托通过setter方法减少
保留计数
并将nil分配给委托。这就是为什么,当设置为零时,它会收到呼叫
因此,您可以将委托声明为弱
,如下所示
@property (nonatomic, weak) id<Protocol> delegate;
@属性(非原子,弱)id委托;
这还意味着您仍然持有或引用另一个类的属性,并且编译器无法为该类调用dealloc方法。如果您完成了,您可以将其设置为nil,或者为其指定弱引用。试着读一下这个这也意味着您仍然持有或引用另一个类的属性,并且编译器不能为该类调用dealloc方法。如果您完成了,您可以将其设置为nil,或者为其指定弱引用。请尝试阅读此内容问题在于您创建了引用循环,对象通过其委托属性引用自身。您需要声明您的委托较弱,或者通过将委托设置为nil来打破循环。问题是您创建了引用循环,其中对象通过其委托属性引用自身。您需要声明委托较弱,或者通过将委托设置为nil来打破循环。