为啥 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没有办法在非主线程上安全地保留和释放UIView
s。
换句话说,如果从后台线程调用 setter,则无论哪种方式,代码都会被破坏。如果只从主线程调用,则可以直接访问 ivar。所以,你没有理由不能直接访问 ivar。
【讨论】:
特别是第 3 点让我怀疑自己 - 完全没有意义。 缺少“nonatomic
”关键字是否不意味着实现是线程安全的。
是的,尽管我希望他们看到 nonatomic
的任何不应该从多个线程中使用的东西。
与 UIKit 的某些交互在 ios 4.0 中是线程安全的,就像 David Duncan 在这里引用的绘图:cocoabuilder.com/archive/cocoa/…,但我不确定这是否与此处相关。
真的,@BradLarson,我已经更新了我的语言,使其更加准确。 :)以上是关于为啥 UIResponder inputAccessoryView 是原子的?的主要内容,如果未能解决你的问题,请参考以下文章
为啥类 AppDelegate 继承自 UIResponder?
为啥 UIResponder inputAccessoryView 是原子的?