为啥 UIResponder inputAccessoryView 是原子的?

Posted

技术标签:

【中文标题】为啥 UIResponder inputAccessoryView 是原子的?【英文标题】:Why is UIResponder inputAccessoryView atomic?为什么 UIResponder inputAccessoryView 是原子的? 【发布时间】:2011-11-19 13:31:44 【问题描述】:

我将inputAccessoryView 用于UIViewController 的自定义子类之一,它是UIResponder 的子类。

Apple Developer Class Reference for -[UIResponder inputAccessoryView] 声明:

想要将自定义控件附加到 系统提供的输入视图(例如键盘)或自定义输入 视图(您在 inputView 属性中提供的视图)应将 [inputAccessoryView] 属性重新声明为 readwrite 并使用它来管理他们的自定义附件 查看。

    重新声明inputAccessoryView后,我必须再@synthesize吗?这样做似乎是让它编译的唯一方法,但我想使用 Apple 的 inputAccessoryView ivar,而不是自己合成。 我可以将inputAccessoryView 重新声明为nonatomic 吗? 如果我不能将inputAccessoryView 重新声明为nonatomic,那么我是否必须始终使用self.inputAccessoryView 访问inputAccessoryView,即通过属性而不是直接访问ivar,以保持线程安全?李>

【问题讨论】:

【参考方案1】:

    是的,除非 UIResponder 公开了 setInputAccessoryView: 方法,否则您必须自己为该属性提供一个设置器。如果您有权访问底层 ivar,则可以自己编写一个 setInputAccessoryView: 方法来设置它。但是,在这种情况下,您无权访问它,因此您必须自己创建一个。

    我不这么认为;这与超类声明不兼容。

    我不明白为什么这个属性不是nonatomic,因为从非主线程调用(几乎)UIKit 中的任何东西都是无效的。特别是这个属性是一个UIView,并且setter没有办法在非主线程上安全地保留和释放UIViews。

    换句话说,如果从后台线程调用 setter,则无论哪种方式,代码都会被破坏。如果只从主线程调用,则可以直接访问 ivar。所以,你没有理由不能直接访问 ivar。

【讨论】:

特别是第 3 点让我怀疑自己 - 完全没有意义。 缺少“nonatomic”关键字是否意味着实现是线程安全的。 是的,尽管我希望他们看到 nonatomic 的任何不应该从多个线程中使用的东西。 与 UIKit 的某些交互在 ios 4.0 中是线程安全的,就像 David Duncan 在这里引用的绘图:cocoabuilder.com/archive/cocoa/…,但我不确定这是否与此处相关。 真的,@BradLarson,我已经更新了我的语言,使其更加准确。 :)

以上是关于为啥 UIResponder inputAccessoryView 是原子的?的主要内容,如果未能解决你的问题,请参考以下文章

为啥类 AppDelegate 继承自 UIResponder?

为啥 UIResponder inputAccessoryView 是原子的?

inputAccessoryView 必须是最顶层的视图吗?

为啥 Firebase 远程配置不更新值?

UIResponder学习 手势

iOS控件之UIResponder类