Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.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 弧中的系统对象代理是否需要设置为零?_Ios_Swift_Delegates_Automatic Ref Counting_Nszombies - Fatal编程技术网

Ios 弧中的系统对象代理是否需要设置为零?

Ios 弧中的系统对象代理是否需要设置为零?,ios,swift,delegates,automatic-ref-counting,nszombies,Ios,Swift,Delegates,Automatic Ref Counting,Nszombies,应用程序有时会崩溃,出现错误objc\u object::release() 苹果开发者技术支持部提到: 请记住,您应该始终执行类似于_tableView.delegate的操作 =零;在-dealoc方法中,即使您使用的是ARC。出于兼容性原因,系统对象使用不安全的 实现委托的引用,而不是首选的 更换较弱 这是否意味着在即将释放视图控制器时,必须将系统对象的委托设置为nil class MyViewController: UIViewController { deinit {

应用程序有时会崩溃,出现错误
objc\u object::release()

苹果开发者技术支持部提到:

请记住,您应该始终执行类似于_tableView.delegate的操作 =零;在-dealoc方法中,即使您使用的是ARC。出于兼容性原因,系统对象使用不安全的 实现委托的引用,而不是首选的 更换
较弱

这是否意味着在即将释放视图控制器时,必须将系统对象的委托设置为nil

class MyViewController: UIViewController {
   deinit {
      tableView.delegate = nil
      tableView.dataSource = nil
   }
}
我总是假设
UITableView
和类似的标准对象正在使用
weak
引用其代理


更新: 技术支持的示例似乎已经过时,因为
UITableView
已更新为
weak
代理。但是,并非所有代理都已更新,例如
AVAudioPlayer.delegate
仍然是
无主(不安全)
。苹果似乎正在逐渐将代理升级为


因此,可以通过检查Xcode中的委托声明来确定是否手动将委托设置为nil。如果它是
弱的
,请不要麻烦。

是的,您应该将这些代理设置为
nil

正如名称所示,
unsafe\u unrepaired
引用不会保留视图控制器,因此这里没有保留周期或内存泄漏。但是,与
不同,在解除分配视图控制器时,这些引用不会自动设置为
nil
。在大多数情况下,这不是问题,因为视图控制器将超过其视图的寿命,或者至少同时解除分配。 不幸的是,在少数情况下,UIKit可能也临时保留了视图。这可能会使视图比视图控制器寿命长,并尝试对解除分配的对象调用委托方法,从而导致崩溃


我所知道的最简单的方法是,在滚动仍在滚动时(例如,通过对一长串项目的强烈滑动手势),关闭并取消分配作为滚动视图(或其子类之一,如UITableView)代理的视图控制器。然后,滚动视图将尝试调用委托方法(如
scrollViewDidScroll
)在解除分配的控制器上。

我应该使用
deinit
方法还是最好的地方在哪里?
deinit
是一个安全合理的地方,因为它将被可靠地调用。即使我设置
tableView.delegate=weakSelf
它也将是一个
不安全的\u未维护的
引用?这正成为一个有趣的新问题,但现在我们开始。对弱引用的工作原理有很好的了解<代码>弱var weakSelf=自身;v、 delegate=weakSelf
与v.delegate=self没有区别;弱var weakSelf=self
。在这两种情况下,
v.delegate
只存储指向您的
self
对象的指针。该引用的归零(或不归零)行为由持有该引用的对象决定,而不是由您传递给它的指针或从中获取该指针的引用的归零行为决定。这是一种非常固执己见的做法,但我仅在需要时才将委托设置为零。我不喜欢将其作为一般规则:PI不认为您需要在deinit方法中将dataSource设置为nil。@Alex我认为您需要,因为属性
dataSource
只是另一个具有不同名称的委托。例如,它为
UICollectionView
实现委托函数
cellForItemAt