Почему UIResponder inputAccessoryView атомарный? - PullRequest
3 голосов
/ 19 ноября 2011

Я использую inputAccessoryView для одного из моих пользовательских подклассов UIViewController, которые подклассы UIResponder.

Справочник по классу Apple Developer для -[UIResponder inputAccessoryView] состояний:

Подклассы, которые хотят присоединить пользовательские элементы управления к системный вид ввода (например, клавиатура) или пользовательский ввод view (тот, который вы предоставляете в свойстве inputView) должен повторно объявить свойство [inputAccessoryView] как readwrite и использовать его для управления своим пользовательским аксессуаром вид.

  1. После повторного выделения слов inputAccessoryView, тогда я должен @synthesize так? Это, казалось, было единственным способом заставить его скомпилироваться, но я хочу использовать inputAccessoryView Apple, а не синтезировать мой собственный.
  2. Можно ли переопределить inputAccessoryView как nonatomic?
  3. Если я не могу переопределить inputAccessoryView как nonatomic, то я должен всегда обращаться к inputAccessoryView с помощью self.inputAccessoryView, т. Е. Через свойство вместо прямого доступа к ivar, чтобы сохранить безопасность потоков?

1 Ответ

2 голосов
/ 19 ноября 2011
  1. Да, вам нужно будет самостоятельно задавать установщик для свойства, если только UIResponder не предоставляет метод setInputAccessoryView:. Если у вас был доступ к нижележащему ivar, вы могли бы просто написать setInputAccessoryView: метод самостоятельно, который его устанавливает. В этом случае, однако, у вас нет доступа к нему, поэтому вам придется создать его самостоятельно.

  2. Я так не думаю; это не будет совместимо с объявлением суперкласса.

  3. Я не понимаю, почему это свойство не nonatomic, так как вызов (почти) чего-либо в UIKit из неосновного потока недопустим. В частности, это свойство имеет значение UIView, и установщик не может безопасно сохранять и освобождать UIView s в неосновном потоке.

    Другими словами, если сеттер вызывается из фонового потока, код нарушается в любом случае. Если он вызывается только из основного потока, вы можете получить доступ к ivar напрямую. Так что нет никаких причин, по которым вы не можете получить доступ к ивару напрямую.

...