Objective-Cでの「プロパティ」「インスタンス変数」「ローカル変数」の違い
たまーにプログラムを調べ調べ書いているために、すぐわけがわかんなくなる。
そのひとつに「Modernな書き方」と「Legacyな書き方」の混在。ずっと追っているとわかるのだろうけども、にわか知識で探っていると、どっちが正しいの!?なんてことになってぐちゃぐちゃに・・・。
という言い訳と前フリはこれくらいにして、たどり着いた結果をまとめてみる。
参考に下のはこちら。
まずは公式。
「Objective-Cによるプロ グラミング」の47-48ページ
https://developer.apple.com/jp/devcenter/ios/library/documentation/ProgrammingWithObjectiveC.pdf
インスタンス変数
インスタンスごとに違った値を保持する変数
”インスタンス変数は、通常クラス自身の外からアクセスされることはない”
以前は.hの@interfaceに記述していたが、いまは.mの@implementationに書くのが主流
プロパティ
インスタンス変数にアクセス指定子を付けて宣言することで、
インスタンス自身ではないオブジェクトからもアクセスできるようになる
.hで宣言する際、
@synthesize topSpeed
と記述。インスタンス変数として別名を指定したい場合は、
@synthesize propertyName = instanceVariableName;
のように=に続けて指定する。
特に指定がなければ、値の設定が可能なプロパティのインスタンス変数は
「_propertyName」という名前になる。
ローカル変数・局所変数
メソッド内だけで利用する変数。これには_(アンダースコア)を付けないようにする。
インスタンス変数へのアクセス
_(アンダースコア)をつけてアクセスする。
- (void)someMethod { NSString *myString = @"An interesting string"; ← ローカル変数 _someString = myString; ← インスタンス変数とローカル変数の違いが明らか! }
プロパティへのアクセス
クラス内からでも常にアクセサメソッドを通して行う。
- (void)someMethod { NSString *myString = @"An interesting string"; self.someString = myString; ← アクセサメソッド(のなかでもセッタ) //または [self setSomeString:myString]; } ※誤ってセッタをゲッタと記載してました。
ちなみに、アクセサメソッドも2通りある。
.(ドット)でのアクセスの方が新しく登場したやり方。
ゲッタメソッドは、プロパティと同じ名前
NSString *firstName = [somePerson firstName];
または
NSString *firstName = somePerson.firstName;
セッタメソッドは、setの後にプロパティ名の先頭を大文字にして連結した名前
[somePerson setFirstName:@"Johnny"];
または
somePerson.firstName = @"Johnny";
と、こんな感じかなーということになったのだけど、「根本的に何から何まで間違ってるぜ!」というところがありましたら、ぜひぜひツッコミいただければです。。。
がっつりじっくり文法を学ばなくちゃ。