警告 - 不兼容的指针类型用'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];
我有两个问题:
- 我很困惑与
obj.*
和[obj *]
- 为什么“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。在这种情况下,使用“复制”消息是一样的好。
希望有所帮助。