Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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 在取消分配其实例并引用其自身时,是否必须将委托设置为nil?_Ios_Swift_Delegates_Automatic Ref Counting - Fatal编程技术网

Ios 在取消分配其实例并引用其自身时,是否必须将委托设置为nil?

Ios 在取消分配其实例并引用其自身时,是否必须将委托设置为nil?,ios,swift,delegates,automatic-ref-counting,Ios,Swift,Delegates,Automatic Ref Counting,系统类由引用自身的委托子类化 class MyScrollView: UIScrollView { convenience init() { delegate = self } // Is this necessary? deinit { delegate = nil } } 解除分配实例时,UIScrollView.delegate属性是否必须设置为nil?只有强引用才能使实例保持活动状态。弱引用(如此委托成员)不足以导致强引用循环。那就

系统类由引用自身的委托子类化

class MyScrollView: UIScrollView {
   convenience init() {
     delegate = self
   }

   // Is this necessary?
   deinit {
      delegate = nil
   }
}

解除分配实例时,
UIScrollView.delegate
属性是否必须设置为nil?

只有强引用才能使实例保持活动状态。弱引用(如此
委托
成员)不足以导致强引用循环。那就需要。。。强有力的参考

另一方面,将
delegate=nil
放在
deinit
中没有多大意义。即使
delegate
成员保持此实例处于活动状态(它不是),那么此
deinit
一开始也不会被调用

// Is this necessary?
deinit {
   delegate = nil
}
在Swift的
deinit
中,将值设置为
nil
从来都不是必需的(您认为它正在做的任何事情都将由ARC自动完成)。在这种特殊情况下,还有很多其他原因不需要这样做,但事实上,这个
deinit
永远都是不正确的


这与你问题的标题无关;我不知道为什么是这个标题。

你的标题和最后一句话问了两个不同的问题。您在问这两个问题中的哪一个?Alexander Title已更改。
UIScrollView
delegate
属性声明为
。您在哪里看到
不安全\u未维护
?@rmaddy我刚刚了解到,它也将删除上面的那一行。然后,在取消分配包含
UIScrollView
的实例(例如
UIViewController
)时,我在哪里将
UIScrollView的委托设置为零?我不明白您为什么要这样做。你是说当代理自己离开时?(可以是保存滚动视图的对象,但不一定是。)如果滚动视图的所有者是代理,则在代理的
deinit
中调用
scrollview.delegate=nil
(但在滚动视图的
deinit
中没有意义)这就是当前标题所说的:
弱开放变量委托:UIScrollViewDelegate?//默认为零。弱引用
如果您有一个最近的DTS指示对象违反了头定义,我肯定会做一些测试来验证。这可能是真的,但它与文档和标题相反。曾经有一段时间,由于历史原因,一些
委托
属性仍然是不安全的
。ObjC头还表示弱:
@property(可为空,非原子,弱)id delegate;//默认为零。弱参考
您链接到的答案基本上是“根据您告诉我的内容,您需要在学员的
deinit
中清除它”。但是(a)我不相信你所说的现在是真的(并且希望看到一个证明它是真的),并且(b)与这个问题无关,这是相反的情况,从来没有被要求过。嗨,说实话,我有一个类似的问题,我现在很困惑,因为在苹果(MapKit)的文档中(如果发现苹果强烈建议将代表设置为nil@Hardy_Germany首先,Apple讨论的是一般情况,而不是
self
delegate
的情况。此外,将
nil
设置为delegate字段有一个微妙的好处。在当前的实现中,对象不是很强的已引用但现有弱引用保持活动状态,直到下次通过弱引用访问它们。手动将它们设置为
nil
可能会加快此解除分配过程