Objective-C でのメソッド、インスタンスメソッドとクラスメソッドの呼び出し方、使用例について、簡単に説明します。
Xcode 9.4
Objective-Cのメソッド
Object-Cのメソッドにはインスタンスメソッドとクラスメソッドの2つがあります。
-
- クラスメソッド:
- クラスをインスタンス化しなくても実行できるメソッド
- 先頭にマイナス(+)をつけて定義
- インスタンスメソッド:
- クラスをインスタンス化して実行するメソッド
- インスタンスの変数を使うことができる
- 先頭にマイナス(-)をつけて定義
- クラスをインスタンス化して実行するメソッド
- クラスメソッド:
クラスメソッド
クラスメソッドはインスタンスとは関連していないため、インスタンスを生成して、インスタンス変装を利用する事ができないグローバル関数のようなものとなります。
簡単な例で確認するとわかりやすいので、XcodeでHello World などを実行する Single View Application のプロジェクトを作成します。
最初にクラスファイルをプロジェクトの中に作成します。Menuの [File] から
[New][File…] にある Objective-C Files File を選び(アイコンの位置は変わる事がありますので臨機応変に)
名前を決めて保存。保存先はプロジェクトフォルダー内に置きます。
同名のヘッダーファイルを作成します。
同じく[New][File…] にある Header File を選択して「Next」
プロジェクトにこのように MyClass.h MyClass.m のファイルが作成されています。
この MyClass に className というクラスメソッドを定義して、ViewController.m から呼び出してみます。
MyClass.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#ifndef MyClass_h #define MyClass_h #endif /* MyClass_h */ #import <Foundation/Foundation.h> @interface MyClass : NSObject // 初期化のクラスメソッド + (id)initMyClass; // クラス名を返すクラスメソッド + (NSString *)callName; @end |
MyClass.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#import <Foundation/Foundation.h> #import "MyClass.h" static NSString *className = @"MyClass"; @implementation MyClass : NSObject // クラスメソッドの実装、初期化処理 + (id)initMyClass { return [[self alloc] init]; } + (NSString*) callName { return className; } @end |
ViewControllerから呼び出して使う時は、メッセージ式を使ってメッセージを介して呼び出します。
ViewController.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#import "ViewController.h" // MyClass のヘッダーをインポート #import "MyClass.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; NSString *className = [MyClass callName]; NSLog(@"Call ClasName:%@", className); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } @end |
これを実行してLogを確認するとこのようになります。
1 |
TestInstanceMethod[1142:33722] Call ClasName:MyClass |
インスタンスメソッド
インスタンスメソッドは別クラスなどからインスタンスを生成して利用します。
MyClass に myMethod を定義していきます。
MyClass.h
1 2 3 4 5 6 7 8 9 10 |
#import <Foundation/Foundation.h> @interface MyClass : NSObject // 初期化のクラスメソッド + (id)initMyClass; // インスタンスメソッドの宣言 - (NSString *) myMethod:(NSString *)myParameter; @end |
MyClass.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#import "MyClass.h" @implementation MyClass // クラスメソッドの実装、初期化処理 + (id)initMyClass { return [[self alloc] init]; } // インスタンスメソッドの実装 - (NSString *) myMethod:(NSString *)myParameter{ NSString *result=[NSString stringWithFormat:@"こんにちは%@です",myParameter]; return result; } @end |
ViewController.m からメソッドを呼び出します。
ViewController.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#import "ViewController.h" // MyClass のヘッダーをインポート #import "MyClass.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // MyClass のインスタンスを生成 MyClass *myClass = [MyClass initMyClass]; // 引数に「山田」を設定 NSString *name = @"山田"; // MyClass のインスタンスメソッド myMethod に引数を入れて呼び出す NSString *str = [myClass myMethod:name]; // 結果をデバッグログで出力 NSLog(@"%@", str); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } @end |
デバッグログで「こんにちは山田です」とresultの値を表示しています。
1 |
TestInstanceMethod[2407:69639] こんにちは山田です |