为什么UIResponder inputAccessoryView是原子的?

时间:2011-11-19 13:31:44

标签: iphone ios uikit uiresponder

我正在使用inputAccessoryView作为UIViewController的一个自定义子类,其子类为UIResponder

Apple Developer Class Reference for -[UIResponder inputAccessoryView]州:

  

要将自定义控件附加到a的子类   系统提供的输入视图(如键盘)或自定义输入   视图(您在inputView属性中提供的视图)应将[{1}}]属性重新声明为inputAccessoryView并使用它来管理其自定义附件   图。

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

1 个答案:

答案 0 :(得分:2)

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

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

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

    换句话说,如果从后台线程调用setter,代码就会被破坏。如果仅从主线程调用,则可以直接访问ivar。所以,没有理由不能直接访问ivar。