0

llvmソースコードから、コンパイラがフラグをサポートしていることに気づきました。

-fconstant-string-class=CLASSNAME

このフラグが存在しない場合、コンパイラはデフォルトでNSConstantStringに設定されているように見えます。

AppleのFoundationLibraryを調べると、NSConstantStringはNSSimpleCStringを継承します。これは、ObjCConstantStringの動作を有効にするために必要なivarを提供します。これは、NSStringの子クラスです。

ただし、通常のObjCコードでは、次のことが完全に合法です。

NSString *anNSString = @"This is an NSConstantString?";

これは問題ないようです(NSConstantStringは子クラスです)。ただし、次の点が異なります。

1)定数文字列のデータは、NSStringでは使用できないNSSimpleCStringで宣言されたivarにファネルする必要があります。

2)NSStringの反復法は、unicharの配列に基づいて構築されていることを示唆しています。これは、NSConstantStringのcharからNSStringのunicharへの変換が必要であることを意味します。

Objective Cでは演算子のオーバーロードは不可能なので、この変換はどのように/どこで行うことができますか?ここで起こっているコード生成のトリックはありますか?それとも私はもっと明白な何かを逃したことがありますか?

4

2 に答える 2

3

フレームワーク内で、扱っているクラスが期待しているクラスではないことがわかるのは、これだけではありません。isKindOfClass:Objective-Cはダックタイプであるため、クラス間に継承関係がある必要はありません(ただし、これは正しく機能させるために望ましいことです)。

インターフェースとして「フロントクラス」を使用し、実装に一連の「プライベートクラス」を使用する方法は、Cocoaフレームワークのパターンに昇格しています。この概念は「クラスクラスター」と呼ばれ、ほとんどのFoundationクラスには独自のクラスターがあります。それらはすべて同じパブリックインターフェイスを共有しているため、すべてが期待どおりに機能します。それらに関する限り、フロントクラス自体はおそらく抽象と見なされるべきです(抽象クラ​​スのコンパイル時の概念はObjective-Cには存在しませんが)。

たとえば、実行ボタンを押すと、両方NSArrayNSMutableArrayなりNSCFArrayます。露骨なダックタイピングの別のケース:前回チェックしたときに、NSString(たとえば)のパスを処理するメソッドを呼び出すと、ドキュメントに。が返されると記載されていても、クラスstringByAppendingPathComponent:のインスタンスが取得されます。NSPathStore2NSString

関連するすべてのメソッドがで実装/オーバーライドされている限り、NSConstantStringのivarがどのように問題になるかわかりません。変換自体に関しては、sへのパブリックアクセスポイントはそれほど多くありません。私の数では、 sを使用する方法は5つだけなので、必要な変換はそこで簡単に実行できます。NSStringNSConstantStringunicharNSStringunichar

編集私はもう少し深くNSString調べて、ストレージに関する限り、そのサブクラスに絶対的な裁量を任せて、ivarを宣言していないことを知りました。NSSimpleCString宣言しchar* bytesint numBytes; NSConstantStringivarを追加しません。unicharどちらのクラスも、アクセスメソッドを実装/オーバーライドします。

于 2012-08-23T04:16:21.883 に答える
1

Objective-Cは動的ディスパッチ言語です。変数をとして宣言していますNSString*が、実際にはの任意のサブクラスである可能性がありNSString*ます。すべてのメソッドは動的にディスパッチされるため(メソッドの呼び出しなど)、コンパイラーがオブジェクトのタイプを何と見なすかは問題ではなく[1]、オブジェクトが実際に何であるかだけが重要です。したがって、そのコード行では、anNSString変数に実際にはのNSConstantString代わりにが含まれていますNSString

[1]:型はセレクターのルックアップ・プロセスに影響を与えます。これは、コンパイラーが引数の型がどうあるべきかを考えることに影響を与え、潜在的な警告と型の暗黙の強制に影響を与えます。これはここでは関係ありません。

于 2012-08-23T04:16:04.570 に答える