インスタンスの値や属性を見たり変更したりするためのメソッドを作って使うのが流儀。
該当インスタンスの値を直接みたり変更するのではなくメソッドを作って変更する。
値や属性などを確認するのがゲッタ(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
前の投稿 »