Obj.C

obj.C:まちがいの元

頭の中のオーバーライドsetter/getter混乱は多分収まりました。

今一度、頭の中を整理したいと思います。

1. まず、メソッドのオーバーライドは、「スーパークラスのメソッドと同じ名前、同じ戻り値型、同じ引数のメソッドをサブクラスで定義することで実現」するという原則に立ち返りたいと思います。

2. 先の問題は、なにか問題があったというよりか、まちがい、勘違いがあったという表現の方が適切です。

  • MesaCont(Controller)でsetter/getterを定義しているMesaModelのメモリをサンプルコード通りModel *model;と書いていたのですが、これはもっと抽象的に変更しておくべきでした。そこに頭が回らなかったことも今回の問題の理解に時間がかかった理由のひとつです。MesaModel *mmBuffer1Addr;と書き換えました。これはクラス型の変数でメモリに確保されたエリアを示すポインタです。modelをクラス型変数だとわかるのに時間がかかりました(泣き)。
  • getterメソッドの呼び出し形式は[ポインタ string]で、意味は「ポインタが指し示す文字列」になります。[mmBuffer1Addr string]の場合、mmBuffer1Addrの中身はポインタ、そのポインタが指し示すメモリが文字列になります。
  • 文法的なミス:
    IBOutlet NSTextView *textViewAddr; と定義されているとき、mcStringWork2 =[textViewAddr string];とするのはまちがいで、やるなら[mmBuffer1Addr setString:[textViewAddr string]];を実行した後でmcStringWork2=mcString;とsetterが設定したmcString(stringの変数名を変更したもの)を代入するべきでした。これでは、setStringを勉強しているときに困りものです。
  • setter/getterで使っている変数stringはmcStringに変更しても門外がないようなので、しばらく様子をみることにしました。
  • また、setter/getterに何回来ているのか表示させるためにint  intCounter1;を参照できるようにMesaModel.mで#import “MesaModel.h”  を組み込みました。これはいずれコメントアウトが必要です。

残る 疑問

  • [textViewAddr setString:@”Mesa”];はsetterが実行されません。常数の文字列が問題なのでしょうか?次のように変更するとsetterが呼び出されるのでそういうことなのでしょうね。
    mcStringWork2 = @”Mesa”;
    [textViewAddr setString:mcStringWork2];
  • 常数の場合、setterで何かするまでもなく文字操作ができることからそうなってしまうのでしょうか?

スクリーンショット 2014-01-31 14.48.06