ios - 如果我们使用 9.3 SDK 构建并部署到系统版本低于 9.3 的设备,委托(delegate)是 `weak` 吗?

标签 ios objective-c

突然发现UIKit在9.3中使用的是weak属性而不是assign,可能已经改了很久但是我没有注意到,感觉很丢脸。

@property(nullable,nonatomic,weak) id<UIScrollViewDelegate>        delegate;

我注意到这是因为 question 。在过去,我们需要在 UIScrollView 方法中将 UITableViewdealloc 的委托(delegate)设置为 nil 以防 crashing

现在由于 SDK 9.3 使用 weak 属性为 delegate ,我认为如果我们使用最新的 SDK 构建我们的应用程序并部署到系统版本高于 iOS5 的任何设备(iOS5 涉及弱属性),我们不需要设置在 dealloc 方法中委托(delegate)为零。

但是在我上面提到的question中,我留下了一条评论:“ 我很想知道当您使用最新的SDK构建和部署到iOS 9以下的设备时它是否会崩溃。您可以尝试一下吗? ”,答案是“ 是的,基础SDK是“最新的iOS(iOS 9.3)”。如果我没有在dealloc方法中将delegate设置为nil,它仍然会崩溃。“。我很困惑。

我的问题是,如果我们使用 9.3 SDK 构建并部署到系统版本低于 9.3 的设备(我的意思是使用 assign 而不是 weak 属性的 SDK),委托(delegate)是 weak 吗?

嗯还有一个问题,如果我们用 9.3 SDK 构建,我们可以部署到系统版本低于 iOS 5.0 的设备(说 4.3,它不支持弱属性)吗?

最佳答案

正如您所说,weak 属性自 iOS 5 以来就已可用。如果您将变量声明为 weak,则当它指向的对象被释放时,它会被设置为 nil。
如果您将委托(delegate)属性分配而不是弱,那么在您的 dealloc 方法中将其设置为 nil 是一个好习惯,但如果您没有这样做,它不应该导致崩溃。
它通常不会导致崩溃,因为在 dealloc 方法完成时,相关对象被释放,因此该属性中的值无关紧要。
将 assign 属性设置为 nil 在它指向的对象被解除分配但执行指向的对象没有被解除分配的情况下更为重要。在这种情况下,未能将属性设置为弱可能会导致僵尸。
编辑:
好的,我只是按照您提到的问题的链接进行操作。我现在明白了。该链接在谈论 UITableView的委托(delegate)属性(property)。在某些较旧的 iOS 版本(不确定何时更改)中,tableView 的委托(delegate)属性是分配的,而不是弱的。因此,当您有一个 View Controller 作为 TableView 的委托(delegate)时,您应该设置 TableView 的 在 View Controller 的 dealloc 方法中将委托(delegate)属性设置为 nil,以避免 TableView 在被释放后尝试调用它的委托(delegate)(您的 View Controller )的情况。
我不确定这是否是一个真正的问题,因为唯一应该对 TableView 有强引用的是 View Controller 的 View 层次结构,当 View Controller 被释放时,整个 View 层次结构也是如此。
在回答您的问题时,重要的是您运行的操作系统版本。 UITableView是系统类,UITableView 的版本编译到操作系统中决定了它的委托(delegate)的内存管理规则。如果 UITableView在给定的操作系统版本上声明它的委托(delegate)是分配,那么当对象被释放时它不会被设置为 nil。

关于ios - 如果我们使用 9.3 SDK 构建并部署到系统版本低于 9.3 的设备,委托(delegate)是 `weak` 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37449727/

相关文章:

ios - 从 Realm 获取所有表(类)

objective-c - UIInterfaceOrientationMaskPortrait 和 UIInterfaceOrientationPortrait 有什么区别

ios - 当 UITableViewCell 在两个单元格背景颜色之间设置动画时,为什么我不能点击它?

objective-c - 如何在 NSVisualEffectView 上叠加背景色并使用鲜艳的控件?

iphone - origin 控件在 Interface Builder 中的作用是什么?

jquery - Phonegap Jquery Mobile 和 Xcode

ios - 如何在广播上传扩展(iOS)中实现上传?

objective-c - ATOI() 结果为 "Exited Unexpectedly/Lost Connection"

ios - NSUserDefaults 拒绝存储 NSString 对象

objective-c - 超过 5 个 UIImage 时出现 Xcode 错误