Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/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
iOS:如果强委托设置为self,则不会调用dealloc_Ios_Delegates_Dealloc_Strong References - Fatal编程技术网

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来打破循环。