1

通常の MyClass を作成し、インスタンス変数を定義しました

@interface MyMFMessageComposeViewController : NSObject
{
    NSString *body;
    NSArray * recipients; 
}

@property (readwrite, strong) NSString *body;
@property (readwrite, strong) NSArray * recipients; 
@end

それから私はにコアセドMFMessageComposeViewController

そしてそれはうまくいきました-驚くべきことに-何らかの理由でクラス変数が正しく転送されました。

これはどのように作動しますか?ランタイムは本当にクラス変数 NAMES を検索して、適切なクラス変数を見つけますか?

強制は単なる記憶のオーバーレイだと思っていました。

あなたの洞察に感謝しますか?

4

1 に答える 1

3

Objective-C は弱い型付け (型付けされていないと言う人さえいます) です。つまり、プログラムが送信しようとするすべてのセレクター (メソッド名) に応答する限り、オブジェクトの正確な型は重要ではありません。

MyMFMessageComposeViewController と MFMessageComposeViewController の両方bodyに、setBodyrecipients、 と呼ばれるメソッドがありますsetRecipients。これは、両方のクラスが body および recipient という名前のプロパティを宣言および合成するためです。(プロパティを合成すると、これらのアクセサー メソッドが作成されるだけであることに注意してください。) 外部オブジェクトからメンバー変数にアクセスする場合は、ドット表記を使用してアクセスしたとしても、これらのメソッドを使用していることになります。

つまり、インスタンス変数に直接アクセスしているわけではありません。代わりに、アクセサー メソッドを使用しています。Objective-C はメソッドを呼び出すときにオブジェクトの型を気にしないため、すべて問題なく動作します。

そうは言っても、このクラスを削除して適切なサブクラスに置き換える必要があります。その時点で、(おそらく) 型キャストについて心配する必要はありません。

于 2012-07-24T17:14:08.310 に答える