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

时间:2012-03-19 17:53:33

标签: objective-c xcode ios5

大家好,我收到了这段代码,XCode警告我“使用UITextField类型的表达式初始化NSString * __ strong的不兼容指针类型”。

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

但是这个很好

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

这个也很好

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

我有两个问题:

  1. 我对obj.*[obj *]
  2. 感到困惑
  3. 为什么“mutableCopy”在这种情况下是正确的?
  4. 我不知道如何在Apple开发人员文档中搜索这些问题;请帮忙。

2 个答案:

答案 0 :(得分:8)

在第一个版本中,由于运算符优先级,您将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 :(得分:1)

在第二个和第三个例子中,强制转换只对searchText进行操作。因此,您将向UITextField对象发送消息。

在第一个中,强制转换适用于整个searchText.text。将UITextField对象分配给NSString变量不是您想要的。您正在寻找的代码是:

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

mutableCopy消息将字符串的副本作为NSMutableString对象返回,当NSMutableString派生自NSMtringString对象时,可以将其分配给NSString。在这种情况下,使用“复制”消息也一样好。

希望有所帮助。