3

私が使用AppCodeしていて、非常に大規模なプロジェクトのコードで興味深い状況にフラグを立てました。プレARC。

サブクラスは、delegate と呼ばれるプロパティを定義して合成します。実はプロパティ宣言はコメントアウトされていました!しかし、その@synthesize delegate = delegate_;声明は後に残されました。

おそらく、基本クラスがデリゲートとも呼ばれるプロパティを定義して合成し、それを同じ名前のバッキング変数と合成するため、コードはコンパイルされます。@synthesize delegate = delegate_;

私の質問は次のとおりです。メッセージがデリゲートに送信されるとどうなりますか

a) 基本クラスのメソッドと

b) サブクラス メソッド内。

AppCodeサブクラスの合成ステートメントにエラーとしてフラグを立てます。

プロパティ 'delegate' のアクセサーは、インスタンス変数 'delegate_' で既に合成されています

4

1 に答える 1

5

この@synthesizeディレクティブは、同名のプロパティの仕様 (原子性、メモリ管理) に従ってアクセサ メソッドと ivar を作成するための省略形です。そのため、サブクラスでプロパティを (再宣言せずに) 再合成すると、アクセサー メソッドをオーバーライドするのとまったく同じように機能します。つまり、スーパークラスの代わりにサブクラスの実装が使用されます。どちらの場合も、実装はコンパイラによって作成されるため、動作に顕著な違いはありません。

1 つの違いは、合成された ivar は ivar と同じ可視性を持つ@privateため、サブクラスは ivar にアクセスできず、プロパティのバッキング変数として使用できないことです。これは、サブクラスでの再合成では別の ivar 名を使用する必要があることを意味します。スーパークラスに がある場合、コンパイラはサブクラスに.*@synthesize wildHorses = wildHorses_;のようなことを要求します。@synthesize wildHorses = equusFerus;


*スーパークラスが作成された ivar のデフォルト名を使用する場合@synthesize wildHorses;、サブクラスは引き続き新しい変数を合成する必要があります。@synthesize wildHorses = wildHorses_;

于 2012-05-21T18:36:17.820 に答える