Предупреждение - несовместимые типы указателей, инициализирующие 'NSString * __ strong' выражением типа 'UITextField' - PullRequest
5 голосов
/ 19 марта 2012

Привет, ребята, я получил этот код, и XCode предупреждает меня о «несовместимых типах указателей, инициализирующих NSString * __ strong с выражением типа UITextField».

NSString *name = (UITextField *)searchText.text;

, но с этим хорошо

NSString *name2 = [(UITextField *)searchText text];

и с этим тоже все хорошо

NSString *name3 = [(UITextField *)searchText.text mutableCopy];

У меня два вопроса:

  1. Я запутался с obj.* и [obj *]
  2. Почему «mutableCopy» является правильным в этом случае?

Я не знаю, как искать в документации для разработчиков Apple эти вопросы;пожалуйста, помогите.

Ответы [ 2 ]

8 голосов
/ 19 марта 2012

В первой версии, из-за приоритета оператора, вы переводите searchText.text в UITextField*, то, что вы хотите сделать, это, вероятно, приведение searchText;

NSString *name = ((UITextField *)searchText).text;

Во второй версии у вас нет точки, поэтому компилятор понимает, что ваше преобразование преобразует searchText в UITextField, и отправляет ему текстовое сообщение. Другими словами, совершенно верно.

Последний случай немного сложен, поскольку включает в себя как время выполнения, так и время компиляции. Как я понимаю;

  • Вы разыгрываете searchText.text на UITextField*. Среда выполнения все еще знает, что объект является строкой NSString, и сообщение mutableCopy, которое существует в обоих случаях, в любом случае перейдет к правильному методу [NSString mutableCopy] и создаст / вернет изменяемую копию NSString, поэтому среда выполнения работает нормально.
  • Поскольку mutableCopy возвращает id (ссылаясь на NSMutableString), компилятор в порядке присваивает NSString (id может быть назначен чему угодно), поэтому время компиляции в порядке.

Вопрос, что такое searchText изначально? Последняя версия, скомпилированная без предупреждения, указывает, что это уже UITextField* или, по крайней мере, тип, который может принимать сообщение text. Если это так, вы должны просто сделать;

NSString *name3 = [searchText.text mutableCopy];
1 голос
/ 19 марта 2012

Во втором и третьем примерах приведение просто работает с searchText.Таким образом, вы отправляете сообщение объекту UITextField.

В первом случае приведение применяется ко всему searchText.text.Назначение объекта UITextField переменным NSString - это не то, что вам нужно.Код, который вы ищете:

NSString *name = ((UITextField *)searchText).text;

Сообщение mutableCopy возвращает копию вашей строки в виде объекта NSMutableString, который может быть присвоен NSString, поскольку NSMutableString является производным от него.В этом случае использование сообщения 'copy' также хорошо.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...