我正在使用inputAccessoryView
作为UIViewController
的一个自定义子类,其子类为UIResponder
。
Apple Developer Class Reference for -[UIResponder inputAccessoryView]
州:
要将自定义控件附加到a的子类 系统提供的输入视图(如键盘)或自定义输入 视图(您在
inputView
属性中提供的视图)应将[{1}}]属性重新声明为inputAccessoryView
并使用它来管理其自定义附件 图。
readwrite
后,我必须inputAccessoryView
吗?这样做似乎是让它编译的唯一方法,但我想使用Apple的@synthesize
ivar,而不是合成我自己的。inputAccessoryView
重新声明为inputAccessoryView
吗?nonatomic
重新声明为inputAccessoryView
,那么我必须始终使用nonatomic
访问inputAccessoryView
,即通过该属性而不是直接访问ivar,为了保护线程安全吗?答案 0 :(得分:2)
是的,除非UIResponder公开setInputAccessoryView:
方法,否则您必须自己为该属性提供一个setter。如果你有权访问底层的ivar,你可以自己编写一个setInputAccessoryView:方法来设置它。但是,在这种情况下,您无法访问它,因此您必须自己创建一个。
我不这么认为;这与超类声明不兼容。
我不明白为什么这个属性不是nonatomic
,因为从非主线程调用(几乎)UIKit中的任何内容都是无效的。特别是,此属性是UIView
,并且setter无法安全地在非主线程上保留和释放UIView
。
换句话说,如果从后台线程调用setter,代码就会被破坏。如果仅从主线程调用,则可以直接访问ivar。所以,没有理由不能直接访问ivar。