2012年1月23日月曜日

iphone開発の基礎知識 カテゴリを理解する

objective-Cにはカテゴリという概念があります。カテゴリは、あるクラスの一部分のメソッドを実現するモジュールです。
カテゴリはクラスと同様にインターフェース部分で宣言を記述し、実装部にその定義を記述します。ただし、インスタンス変数を宣言することはできません。

カテゴリは以下のように宣言します。

    @interface クラス名 (カテゴリ名)
    メソッド宣言;
    @end

実装部は、以下のように記述します。

    @implementation クラス名 (カテゴリ名)
    メソッド宣言;
    @end
カテゴリの利用で多いケースは、既存のクラスに新しいメソッドを付け加える場合です。
新しいインスタンス変数の追加はできませんが、新しく追加したメソッド定義から既存のインスタンス変数やメソッドにはアクセス可能です。

以下にサンプルのコードを記述します。

#import <Foundation/NSString.h>

@interface NSString (Hiroshimaben) 

- (NSString *)stringByAppendingHiroshimaben:(NSString *)str;

@end

上記のサンプルは、NSStringクラスにstringByAppendingHiroshimabenメソッドを宣言しています。このメソッドは、受け取った引数の文字列に「jyaken-no」という文字列を追加して返すようにします。
次に実装部です。

#import "NSString+Hiroshimaben.h"

@implementation NSString (Hiroshimaben)

- (NSString *)stringByAppendingHiroshimaben:(NSString *)str {
    NSString* returnStr = [str stringByAppendingString:@"jyaken-no"];
    return returnStr;
}

@end

実装部はヘッダーファイルのimportが必要です。ファイル名は「クラス名+カテゴリ名」とするのが良いとされています。
さて、では上記のファイルをコンパイルして実行してみましょう。

    NSString *str = @"test";
    NSLog(@"str is : %@", [str stringByAppendingHiroshimaben:str]);

以下の結果が出力されます。

    str is : testjyaken-no

文字列に「jyaken-no」が追加されているのが確認できますね。

カテゴリは、既存のメソッドで定義されているメソッドも上書き可能です。
しかし、上書きする場合は、十分な注意が必要です。見かけ上は単純なメソッドでも、プログラム内で様々な目的で使われている場合があります。そのようなメソッドを置き換えた場合。プログラムが正しく動作しなくなります。
なので、カテゴリを用いて既存のメソッドを置き換えるのはあまりおすすめできません。サブクラスでおこなったほうが安全です。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...