为什么UIResponder的inputAccessoryView是原子的?

3
我正在使用inputAccessoryView来为我的自定义UIViewController子类提供服务,该子类继承了UIResponderApple开发者类参考文档中的- [UIResponder inputAccessoryView]说明如下:
子类如果想将自定义控件附加到系统提供的输入视图(例如键盘)或自定义输入视图(inputView属性中提供的输入视图)中,应重新声明[inputAccessoryView]属性并将其设置为readwrite,用于管理其自定义附件视图。
以下是要回答的问题:
1.在重新声明inputAccessoryView后,我是否需要对其进行@synthesize?这样做似乎是唯一使其编译成功的方法,但我想使用Apple的inputAccessoryView ivar,而不是合成我自己的ivar。
2.我能否将inputAccessoryView重新声明为nonatomic
3.如果无法将inputAccessoryView重新声明为nonatomic,那么我必须始终通过属性访问inputAccessoryView,即self.inputAccessoryView,而不是直接访问ivar,以保留线程安全性吗?
1个回答

2
  1. 是的,你需要为该属性提供一个setter方法,除非UIResponder暴露了一个setInputAccessoryView:方法。如果你能够访问到底层的ivar,你可以自己编写一个setInputAccessoryView:方法来设置它。但在这种情况下,你无法访问它,所以你必须自己创建一个。

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

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

    换句话说,如果setter方法是从后台线程调用的,那么代码无论如何都会出错。如果只从主线程调用,你可以直接访问ivar。因此,你完全可以直接访问ivar。


特别是第三点让我感到困惑 - 完全没有意义。 - Till
缺少“nonatomic”关键字并不意味着实现是线程安全的。 - Dave DeLong
确实,我希望他们看到任何不打算从多个线程中使用的属性都应该是 nonatomic - Jesse Rusak
在iOS 4.0中,某些与UIKit的交互被线程安全化,例如David Duncan在这里提到的绘图:http://www.cocoabuilder.com/archive/cocoa/296299-drawing-thread-safety-in-ios.html,但我不确定这是否与此相关。 - Brad Larson
没错,@BradLarson,我已经更新了我的语言,使其更加准确。 :) - Jesse Rusak
谢谢,我想我会使用 self.inputAccessoryView 来访问它,这样更安全。 - ma11hew28

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接