いいえ、作成後にクラスのタイプを変更することはできません。[1]
最善のアプローチは、通常、クローンを作成するメソッドを作成することです。この場合のクラス変数は、通常、メッセージを送信するオブジェクトです。
この形式の一般的な例は次のとおり[NSString stringWithString:s]
です[NSMutableString stringWithString:s];
。
ビューを扱っているため、多くの場合、内部型を定義してオブジェクト構成を使用する方が簡単です。したがって、タイプはありませんが、RedGradientButton
代わりMyGradientButton
に (たとえば)characteristics
メンバーを持つタイプがあります。次に、複数の特性タイプを作成できます (サブクラス化が本当に適切な設計である場合)。
[1]できますが、しないでください…誰かがそれを達成する方法を教えてくれたら. 理由: 安全ではないため、1 つのアプローチが廃止されます。メソッドを更新するクラスを設定できますが、これを行ってもオブジェクトの他の側面は変更されません。明らかなケースは、メンバー レイアウトの違いを反映するようにオブジェクトのサイズが変更または更新されないことです。つまり、オブジェクトにメッセージを送信し、サブクラスに存在するがスーパークラスには存在しないメンバーにアクセスすると、メソッドの実装は読み取りまたは書き込みを行います。無効なメモリ (これは未定義の動作です)。機能しているように見えたり、動的に証明したり、安全であることを保証するためにできる限りのことを行ったりした場合でも、最新のランタイムは壊れにくいオブジェクト ABI を使用します。基本クラスに必要なメモリは、リリースごとに自由に変更できます。このような設計では、サイズ変更時に他のエラーが発生する可能性があります (リーク、参照できないメモリ、または別のクラスのデータへのメモリの「型変換時の初期化」)。したがって、割り当てサイズの問題を克服したとしても、オブジェクトを使用可能な状態のままにする方法で、インスタンスの部分的な割り当て解除と部分的な初期化を実行する方法を考案する必要があります。これは非常に複雑です。