2012-03-19 52 views
5

嗨,大家好,我得到了這段代碼,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開發人員文檔中搜索這些問題;請幫忙。

回答

8

在第一個版本中,由於運算符的優先級,您將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]; 
1

在第二個和第三個示例中,演員只是對searchText進行操作。所以用這些你正在向UITextField對象發送消息。

在第一個中,轉換適用於整個searchText.text。將UITextField對象分配給NSString變量不是您想要的。您正在尋找的代碼是:

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

的mutableCopy消息返回的字符串的副本作爲的NSMutableString對象,可以作爲的NSMutableString提煉出來的被分配到的NSString。在這種情況下,使用「複製」消息是一樣的好。

希望有所幫助。

相關問題