2010年9月30日木曜日

obj-Cのクラスメソッドとインスタンスメソッドの違い

以下のようなクラスを自分で定義したとする。

<CVImageProcessView.h>ーーーーーーーー
//どの画像処理をするのかを決定するようなUIなどの機能を持つクラス

@interface CVImageProcessView: UIView{
    UIImageView *imageView; //クラス変数
    UIButton *btn;
}

@property(nonatomic, retain)IBOutlet UIImageView *imageView;
@property(nonatomic, retain)IBOutlet UIButton *btn;

-(IBAction)pushBtn:(id)sender; //ボタンが押されたら(アクション実行)呼ばれる

@end

<CVImageProcessView.m>ーーーーーーーー
#import "CVImageProcessView.h"

@implementation CVImageProcessView
@synthesize imageView; //ゲッターとセッターを自動生成
@synthesize btn;

 -(IBAction)pushBtn:(id)sender
{
     //インスタンスを作らずにメソッドを呼び出す
     BOOL Call = [CVImageProcessor doSomeImageProcessClass:[imageView image]];
   
     //インスタンスを作ってからメソッドを呼び出す
     CVImageProcessor * imageProcessor = [[CVImageProcessor alloc]init];
     BOOL Call__ = [imageProcessor doSomeImageProcessInstance[imageView image]];
}
@end


<CVImageProcessor.h>ーーーーーーーー
//画像処理をするためのクラス

@interface CVImageProcessor : NSObject {

UILabel *label;
}

+(BOOL)doSomeImageProcessClass:(UIImage *)image; //クラスメソッド
- (BOOL)doSomeImageProcessInstance:(UIImage *)image; //インスタンスメソッド

@end


<CVImageProcessor.m>ーーーーーーーー

+(BOOL)doSomeImageProcessClass:(UIImage *)image//クラスメソッド
{
        lable.text = @"doSomeImageProcessClass is called";
/*Imageを使った画像処理*/
        return YES;
}

- (BOOL)doSomeImageProcessInstance:(UIImage *)image; //インスタンスメソッド
{
    lable.text = @"doSomeImageProcessInstance is called";
/*Imageを使った画像処理*/
        return YES;

}



って感じですかね。


さー、間違いはどこだ!!!www


って言うのは冗談で、関数の戻り値の頭に+がついている
+(BOOL)doSomeImageProcessClass:(UIImage *)image//クラスメソッド
がありますよね。

これの中で、 
lable.text = @"doSomeImageProcessClass is called";
という処理をしていますが、これが出来ません!

普段C++を使っているのもあるのか無いのか、これが意味不明でした。。
(C++だとクラスメソッド使えば、アクセスできるやん!ってことで。)

でも、簡単にいうと
+がついてる関数→クラス変数にアクセス出来ません。
ーがついてる関数→クラス変数にアクセス出来ます。

(もちろんどっちの関数にしろ、スコープ内で変数は宣言、使用できます。)

て感じらしいです。

本には、ちゃんとインスタンスがどうのこうの書いてありますが、
知識でしかなくて実際これで困らないと理解できませんでした(´ー`)

0 件のコメント:

コメントを投稿