オブジェクト変数を として宣言しますがNSString
、XCode を使用してオブジェクトを調べると、2 つのタイプの String があることがわかりました。システムが自動的に別のタイプに転送されるようです。

それらの違いは何ですか?それらは、あるものと他のものと交換可能ですか。また、2つが別のものに変わる条件は何ですか?
ありがとう。
オブジェクト変数を として宣言しますがNSString
、XCode を使用してオブジェクトを調べると、2 つのタイプの String があることがわかりました。システムが自動的に別のタイプに転送されるようです。

それらの違いは何ですか?それらは、あるものと他のものと交換可能ですか。また、2つが別のものに変わる条件は何ですか?
ありがとう。
どちらも の具体的なサブクラスですNSString。__NSCFStringFoundation または Core Foundation を介して実行時に作成されるものであり、コンパイル時に作成される定数または定数の__NSCFConstantStringいずれかです。CFSTR("...")@"..."
それらのインターフェースはプライベートです。それらを両方とも扱いNSString、問題はないはずです。
私の知る限り、文字列データをコードメモリに保持NSCFConstantStringする実装です。定数NSStringを使用すると、コンパイラはそのインスタンスを作成します。サブクラス/スーパークラスの関係により、どこでも@"string"使用できますが、明らかにその逆ではありません。NSCFConstantStringNSString
コンパイラによる最適化のようです。に変換される文字列はNSCFConstantString、パフォーマンス上の理由からキャッシュされている定数の 1 つと等しいと思います。YourNSCFStringは、NSStringまたはCFString. 詳細については、この記事を参照してください。