クラスを更に考える (6/8)
作成:2011-02-09 09:11
更新:2011-11-13 16:31
更新:2011-11-13 16:31
■アクセス権を@publicにする
では、MyObjCAppクラスに用意したmessageインスタンス変数を、自由に外部からアクセスできるようにしてみましょう。
下のリスト欄にその例をあげておきました。直接インスタンス変数を操作できるので、インスタンス変数にアクセスするメソッドは不要になります。非常にクラスがシンプルになりましたね。
mainでは、実際にmessageに値を設定しています。インスタンス変数を指定する場合、[]のメッセージ式は使えません。これはインスタンスにメッセージを送ってメソッドを実行させるものですから。ではどうするのかというと、「->」演算子を使います。そう、Cの構造体で、その内部にある値を取り出すのに利用した演算子です。
インスタンスも基本的にはクラスのポインタとして変数に保管されますから、構造体ポインタから値を取り出すのと同じやり方でインスタンス変数にアクセスすることができます。main関数では、
また、このように->を使ってインスタンス変数にアクセスするためには、インスタンスを保管する変数は静的結合である必要があります。id型を使った動的結合では、実行時までそれがどういうクラスのインスタンスが収められているのかわかりません。必ず静的結合を使うようにしましょう。
下のリスト欄にその例をあげておきました。直接インスタンス変数を操作できるので、インスタンス変数にアクセスするメソッドは不要になります。非常にクラスがシンプルになりましたね。
mainでは、実際にmessageに値を設定しています。インスタンス変数を指定する場合、[]のメッセージ式は使えません。これはインスタンスにメッセージを送ってメソッドを実行させるものですから。ではどうするのかというと、「->」演算子を使います。そう、Cの構造体で、その内部にある値を取り出すのに利用した演算子です。
インスタンスも基本的にはクラスのポインタとして変数に保管されますから、構造体ポインタから値を取り出すのと同じやり方でインスタンス変数にアクセスすることができます。main関数では、
MyTestClass* obj = [MyTestClass myTestClass];このようにしてmessageにテキストを設定していました。アクセス権を@publicにすると、このように自由にインスタンス変数が利用出来るようになります。
obj->message = @"This is First Object!!";
また、このように->を使ってインスタンス変数にアクセスするためには、インスタンスを保管する変数は静的結合である必要があります。id型を使った動的結合では、実行時までそれがどういうクラスのインスタンスが収められているのかわかりません。必ず静的結合を使うようにしましょう。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
※MyTestClassのヘッダー部分
@interface MyTestClass : NSObject {
@public
NSString* message;
}
+(MyTestClass*)myTestClass;
-(void)printMessage;
@end
※MyTestClassの実装部分
@implementation MyTestClass
+(MyTestClass*)myTestClass {
MyTestClass* obj;
@autoreleasepool {
obj = [[self alloc] init];
}
return obj;
}
-(void)printMessage {
NSLog(@"%@",message);
}
@end
※クラスを利用しているmain関数の例
int main (int argc, const char * argv[]) {
MyTestClass* obj = [MyTestClass myTestClass];
obj->message = @"This is First Object!!";
[obj printMessage];
return 0;
}
※関連コンテンツ
「初心者のためのObjective-Cプログラミング入門」に戻る