インスタンスの値や属性を見たり変更したりするためのメソッドを作って使うのが流儀。
該当インスタンスの値を直接みたり変更するのではなくメソッドを作って変更する。
値や属性などを確認するのがゲッタ(getter)
値や属性を変更するのがセッタ(setter)
という名前としてつけられてる。
例)
num1 num2 num3というインスタンス変数があった場合の
num1だけ見たり変更したりするゲッタセッタ
-(int)num1{return num1;) //ゲッタ(ただnum1の値を返す)
-(void)setNum1 : (int)newvalue{
num1 = newvalue; //セッタ(num1の値をnewvalueに変更)
}
アクセサは@property @symthesizeを書くことで同様のことができる。
@propertyの書き方
例)
@property (retain,nonatomic) (id) *count;
のように属性などをつけて定義する。
アクセサを作る対象がオブジェクトの場合、retain nonatomicはつけるのが慣例
nonatomic とretainについて後で確認。
この例のretainは使用中はメモリから消されないようにする
2011年11月10日木曜日
型とクラス
インスタンス化するとき、id型を利用するが、特定のクラスのインスタンスということを明記することができる
クラス"class"専用のインスタンスを言うことを書きたい場合
class *x
というように*をつける。
このように生成されたオブジェクトはポインタとして生成され
class *x,*y
x = [[class alloc] val : 0];
x = y;
とした場合。xで実行した結果がそのままyに引き継がれる。
継承して新しく作ったクラスは、スーパークラス用に定義されたクラス名に入れることができる
例) class1 *a
@interface class : NSObject
- (void)hello
@end
@implemantation
なんちゃら
@end
@interface class2 : class
-(void) hello
@end
〜
int main(void){
class *a,*b;
a = [[class alloc] init];
b = [[class2 alloc] init];
}
というようにclass1用に作ったものでも継承して作られたclass2に入れることができる。
ただし、スーパークラスで定義されたメソッドのみしか使えない。
使いたい場合は、class2の型にキャストして利用する。
例
class1 *a,*b;
a = [[class1 alloc] init];
b = [[class2 alloc] init];
[a class1onlymethod];
[b class1onlymethod];//class2でclass1から継承したclass1にあるメソッドを利用してもエラーでない
[b class2onlymethod];//オーバーライドしたものはエラーが出る
[(class2 *)b class2onlymethod];//class2用の型にキャスト
テクニック
if文の条件の評価順序をうまく使い、インクリメントや文字列の評価をする
例)if (p && *p)
pが空の場合はそれ以降の評価は行われない。
ポインタのpかどうか調べる際、pが空だとコンパイラが落ちるので落とさずに値の評価ができる
クラス"class"専用のインスタンスを言うことを書きたい場合
class *x
というように*をつける。
このように生成されたオブジェクトはポインタとして生成され
class *x,*y
x = [[class alloc] val : 0];
x = y;
とした場合。xで実行した結果がそのままyに引き継がれる。
継承して新しく作ったクラスは、スーパークラス用に定義されたクラス名に入れることができる
例) class1 *a
@interface class : NSObject
- (void)hello
@end
@implemantation
なんちゃら
@end
@interface class2 : class
-(void) hello
@end
〜
int main(void){
class *a,*b;
a = [[class alloc] init];
b = [[class2 alloc] init];
}
というようにclass1用に作ったものでも継承して作られたclass2に入れることができる。
ただし、スーパークラスで定義されたメソッドのみしか使えない。
使いたい場合は、class2の型にキャストして利用する。
例
class1 *a,*b;
a = [[class1 alloc] init];
b = [[class2 alloc] init];
[a class1onlymethod];
[b class1onlymethod];//class2でclass1から継承したclass1にあるメソッドを利用してもエラーでない
[b class2onlymethod];//オーバーライドしたものはエラーが出る
[(class2 *)b class2onlymethod];//class2用の型にキャスト
テクニック
if文の条件の評価順序をうまく使い、インクリメントや文字列の評価をする
例)if (p && *p)
pが空の場合はそれ以降の評価は行われない。
ポインタのpかどうか調べる際、pが空だとコンパイラが落ちるので落とさずに値の評価ができる
ラベル:
iphone,
objective-c
継承について
クラスの機能を受け継いで新しい機能をつけたしたクラスを簡単につくることができます。
クラスの機能を受け継ぐことを継承といいます。
クラスA→クラスB(Aの機能にメソッドを一個追加)→クラスD(A+Bの機能)
→クラスC(Aの機能に変数とメソッドを追加)
クラスAのインスタンス変数名やメソッド名はBでもCでもそのままつかえます。
さらにクラスBからクラスDのように機能をどんどん継承して自由に機能を利用することができます。
継承する元のクラスをスーパークラスと言い、継承して新しく作ったクラスはサブクラスといいます。
iPhone開発の場合、全ての大本のクラスはNSObjectsというクラスなので
特段継承するクラスを作っていない場合などはNSObjectsを継承させる。
クラスを継承する場合のクラスの書き方
@interface newclass : NSObjects または継承するクラス名(スーパークラス)
{
インスタンス変数;
}
-メソッド
@end;
継承とメソッドのオーバーライドについて
クラスA
クラスB
クラスC
の3つのクラスがあったとして、A→B→Cという感じで継承していた時
クラスAにはa b cの3つのメソッドが定義されているとする。
クラスBでbメソッドの定義を書き換えたら、クラスCで継承されたとき書き換えられたbメソッドをつかう。
他に書き換えられてない場合、大本のAのメソッドが継承され、使われる。
☆クラスBで書き換えたbメソッドではなく、スーパークラス(クラスA)の書き換え前のbメソッドを使いたい場合、superというものに対してメソッドを引数にして呼び出すとスーパークラスのメソッドが呼ばれる。
例)
[b]→自分で書き換えたメソッドが呼ばれる
[super b]→スーパークラスのbが呼ばれる
☆イニシャライザについて
インスタンス変数の初期化、サブクラスで初期化を行う場合
-(id)init
{
self = [super init];
if(self =! nil){
year = @"";
//初期化するコードが入る
}
return self;
}
クラスの機能を受け継ぐことを継承といいます。
クラスA→クラスB(Aの機能にメソッドを一個追加)→クラスD(A+Bの機能)
→クラスC(Aの機能に変数とメソッドを追加)
クラスAのインスタンス変数名やメソッド名はBでもCでもそのままつかえます。
さらにクラスBからクラスDのように機能をどんどん継承して自由に機能を利用することができます。
継承する元のクラスをスーパークラスと言い、継承して新しく作ったクラスはサブクラスといいます。
iPhone開発の場合、全ての大本のクラスはNSObjectsというクラスなので
特段継承するクラスを作っていない場合などはNSObjectsを継承させる。
クラスを継承する場合のクラスの書き方
@interface newclass : NSObjects または継承するクラス名(スーパークラス)
{
インスタンス変数;
}
-メソッド
@end;
継承とメソッドのオーバーライドについて
クラスA
クラスB
クラスC
の3つのクラスがあったとして、A→B→Cという感じで継承していた時
クラスAにはa b cの3つのメソッドが定義されているとする。
クラスBでbメソッドの定義を書き換えたら、クラスCで継承されたとき書き換えられたbメソッドをつかう。
他に書き換えられてない場合、大本のAのメソッドが継承され、使われる。
☆クラスBで書き換えたbメソッドではなく、スーパークラス(クラスA)の書き換え前のbメソッドを使いたい場合、superというものに対してメソッドを引数にして呼び出すとスーパークラスのメソッドが呼ばれる。
例)
[b]→自分で書き換えたメソッドが呼ばれる
[super b]→スーパークラスのbが呼ばれる
☆イニシャライザについて
インスタンス変数の初期化、サブクラスで初期化を行う場合
-(id)init
{
self = [super init];
if(self =! nil){
year = @"";
//初期化するコードが入る
}
return self;
}
ラベル:
iphone,
ObjectiveC
前の投稿 »