@blog.justoneplanet.info

日々勉強

Objective-Cのオブジェクトとクラス

■サンプルコード

こんな感じ。

Util.h

ヘッダ部分。

#import <Foundation/Foundation.h>

@interface Util/*クラス名*/ : NSObject/*親クラス*/ {
    // インスタンス変数の宣言
    float num;
}
// プロパティの宣言
@property float num;

// メソッドの宣言
+ (void)showAlertWithTitle:(NSString *)title withText:(NSString *)text;
@end

Util.m

実装部分。

@implementation Util
// プロパティの実装指示
@synthesize size;
+(void)showAlertWithTitle:(NSString *)title withText:(NSString *)text
{
    // 実装
}
@end

■サンプルコード

とりあえず書いてみる。

Animal.h

メソッドの宣言を記述する必要がある。

#import <Foundation/Foundation.h>
@interface Animal:NSObject {
    id _name;
}
@property(copy, readwrite) NSString *_name;
-(id)         init:(NSString *)name;// initialize
-(NSString *) cry: (NSString *)name;// instance method
+(NSString *) getKind;              // class method
@end

-がインスタンスのメソッドで、+がクラスメソッドでPHPのstaticのような扱いになる。

Animal.m

実装部分。本題から逸れるが、文字列結合部分の処理はPHPのsprintfのような扱いになる。

#import "Animal.h"
@implementation Animal
@synthesize _name;
- (id) init: (id) name {
    [super init];
    self._name = name;
    return self;
}
-(NSString *)cry: (NSString *)name{
    return [NSString stringWithFormat:@"cry! from %@ to %@", self._name, name];
}
+(NSString *)getKind{
    return @"Animal";
}
@end

宣言したときと引数の型まで一緒になるようにしないとね!

Dog.h

Animalクラスを継承する。プライベート変数を記述しない場合は、以下のように{}を記述しなくても良い。

#import "Animal.h"
@interface Dog : Animal
@end

Dog.m

特に変わった事をする必要はない。同名のメソッドを定義するとオーバーライドされる。

#import "Dog.h"
@implementation Dog
-(NSString *)cry: (NSString *)name{
    return [NSString stringWithFormat:@"bow! from %@ to %@", self._name, name];
}
+(NSString *)getKind{
    return @"Dog";
}
@end

クライアントコード

以下のようにして定義したクラスを使用する。

Dog *pochi = [[Dog alloc] init: @"pochi"];
NSString *voice = [pochi cry:(NSString *)@"hoge"];
NSString *kind  = [Dog getKind];
[pochi release];

allocで領域を確保したものは必ずreleaseする必要がある。また、以下のようにして現在の処理を抜けたときに自動的にreleaseすることもできる。

Dog *pochi = [[[Dog alloc] init: @"pochi"] autorelease];
NSString *voice = [pochi cry:(NSString *)@"hoge"];
NSString *kind  = [Dog getKind];

allocメソッドでインスタンスを生成し、initメソッドでインスタンスを初期化している。

■メソッドの使用

以下のようにしてメソッドを使用する。

[objName methodName]

ターゲットにメッセージを送るメッセージングという形式だ。引数を渡す場合は、以下のようにする。

[objName methodName:arg1]

引数が2つ以上ある場合、以下のようにラベルを使用する。

[objName methodName:arg1 label1:arg2]

インスタンスメソッドとクラスメソッドで特に違いはない。

■プロパティへのアクセス

以下のようにしてインスタンスのプロパティにアクセスすることができる。

pochi._name

アクセサメソッド(getterやsetter)を用いる方がスマートではある。

■親クラスかどうかを調べる

以下のようにisSubclassOfClassを使用する。

if([[obj class] isSubclassOfClass:[NSDictionary class]]){
    // something
}

■インスタンスかどうかを調べる

以下のようにしてインスタンスの基底クラスを調べる。

if([obj isMemberOfClass:[NSDictionary class]]){
    // something
}

■プロトコルを実装しているかどうかを調べる

以下のようにしてプロトコルを実装しているかどうかを調べる。

if([obj conformsToProtocol:@protocol(NSObject)]){
    // something
}

コメントはまだありません»

No comments yet.

RSS feed for comments on this post.TrackBack URL

Leave a comment