警告 - 使用类型为"UITextField"的表达式初始化"NSString*__ strong"的不兼容指针类型

roc*_*ock 5 xcode objective-c ios5

大家好,我得到了这个代码,XCode警告我"不兼容的指针类型初始化NSString*__ strong与UITextField类型的表达式".

NSString *name = (UITextField *)searchText.text;
Run Code Online (Sandbox Code Playgroud)

但是这个很好

NSString *name2 = [(UITextField *)searchText text];
Run Code Online (Sandbox Code Playgroud)

这一个也很好

NSString *name3 = [(UITextField *)searchText.text mutableCopy];
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 我很困惑obj.*[obj *]
  2. 为什么"mutableCopy"在这种情况下是正确的?

我不知道如何在Apple开发人员文档中搜索这些问题; 请帮忙.

Joa*_*son 8

在第一个版本中,由于运算符优先级,你要转换searchText.text为a UITextField*,你想要做的可能就是强制转换searchText;

NSString *name = ((UITextField *)searchText).text;
Run Code Online (Sandbox Code Playgroud)

在第二个版本中,您没有点,因此编译器会理解您的强制类型转换为将searchText转换为UITextField并向其发送文本消息.换句话说,完全正确.

最后一种情况有点棘手,因为它涉及运行时和编译时.据我所知;

  • 你投searchText.text了一个UITextField*.运行时仍然知道该对象是一个NSString,并且mutableCopy两者上存在的消息无论如何都将转到正确的方法[NSString mutableCopy]并创建/返回NSString的可变副本,因此运行时它可以正常工作.
  • 由于mutableCopy返回id(引用NSMutableString),编译器对NSString的赋值是可以的(id可以分配给任何东西),所以编译时间没问题.

一个问题,searchText原来是什么?在没有警告的情况下编译的最后一个版本表明它已经是一个UITextField*,或者至少是一个可以接收text消息的类型.如果是这样,你应该能够做到;

NSString *name3 = [searchText.text mutableCopy];
Run Code Online (Sandbox Code Playgroud)