2012-03-19 7 views
5

こんにちは、私はこのコードを手に入れました。私はobj.*[obj *]で混乱しています警告 - 型 'UITextField'の式を使用して 'NSString * __ strong'を初期化する互換性のないポインタ型

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

    が、この1つは

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

    結構ですし、この1つは結構ですが、あまりにも

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

    は、私は2つの質問があります

  2. なぜ "mutableCopy"が正しいのですか?

Apple開発者向けのマニュアルでは、これらの質問を検索する方法がわかりません。助けてください。

答えて

8

最初のバージョンでは、演算子の優先順位のためにsearchText.textUITextField*にキャストしています。実行する操作はおそらくsearchTextです。あなたは、ドットを持っていないので、コンパイラはUITextFieldに検索テキストをキャストするためにあなたのキャストを理解し、それにテキストメッセージを送信する第二版では

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

。言い換えれば、正確に正しい。

最後のケースは、実行時とコンパイル時の両方を伴うため、少しトリッキーです。私はそれを理解する。

  • searchText.textUITextField*にキャストします。ランタイムは、オブジェクトがNSStringであり、両方に存在するmutableCopyメッセージが正しいメソッド[NSString mutableCopy]に移動し、NSStringの変更可能なコピーを作成/返すので、ランタイムは正常に機能します。
  • mutableCopyid(NSMutableStringを参照しています)を返しますので、コンパイラはNSStringへの代入をOKです(idは何にでも割り当てることができます)。

質問は、searchTextとは何ですか?警告なくコンパイルされた最後のバージョンは、既にUITextField*であること、または少なくともtextメッセージを受け取ることができるタイプであることを示しています。もしそうなら、あなたはちょうどできるはずです。

NSString *name3 = [searchText.text mutableCopy]; 
1

第2および第3の例では、キャストはsearchTextでのみ動作します。したがって、これらを使用すると、UITextFieldオブジェクトにメッセージを送信しています。

最初のキャストは、searchText.text全体に適用されます。 UITextFieldオブジェクトをNSString変数に割り当てることは、あなたが望むものではありません。あなたが探しているコードは次のとおりです。

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

mutableCopyメッセージはNSMutableStringはそれから派生してNSStringのに割り当てることができますNSMutableStringオブジェクト、としてあなたの文字列のコピーを返します。この場合、「コピー」メッセージを使用することはまあまあです。

希望に役立ちます。

関連する問題