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

问题描述:

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

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

但是这一次是罚款

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

而这一次也没关系

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

我有两个问题:

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

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

在第一个版本中,由于运算符的优先级,您将searchText.text转换为UITextField*,您想要执行的操作可能是投射searchText;

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

在第二个版本你没有点,所以编译器了解你投以铸造SEARCHTEXT到UITextField并发送短信给它。换句话说,完全正确。

最后一种情况有点棘手,因为它涉及运行时间和编译时间。据我了解;

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

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

NSString *name3 = [searchText.text mutableCopy]; 

在第二个和第三个示例中,演员只是对searchText进行操作。所以用这些你正在向UITextField对象发送消息。

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

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

的mutableCopy消息返回的字符串的副本作为的NSMutableString对象,可以作为的NSMutableString提炼出来的被分配到的NSString。在这种情况下,使用“复制”消息是一样的好。

希望有所帮助。