Takahiro Octopress Blog

-1から始める情弱プログラミング

シングルトンパターンとクラスメソッドとインスタンスメソッド

シングルトンを使用したクラスでクラスメソッドとインスタンスメソッドを定義する

本日は、シングルトンを使用したクラスの作成と、その中でクラスメソッドとインスタンスメソッドを定義した場合に、どう扱うのかについて見ていきます。
早速、シングルトンパターンのクラスを定義しましょう。
NSObjectを親クラスとしたSingletonSampleクラスを作成します。

1
2
3
4
5
6
7
8
9
// SingletonSample.hファイル
#import <Foundation/Foundation.h>

@interface SingletonSample : NSObject

// シングルトンパターンであることを定義
+ (SingletonSample *)sharedInstance;

@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// SingletonSample.mファイル
#import "SingletonSample.h"

@implementation SingletonSample

+ (SingletonSample *)sharedInstance
{
  static SingletonSample *sharedInstance = nil;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
      sharedInstance = [SingletonSample alloc] init];]
  });

  return sharedInstance;
}

@end

これでシングルトンパターンのクラスとして定義できました。

次にクラスメソッドとインスタンスメソッドを定義してみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// SingletonSample.hファイル
#import <Foundation/Foundation.h>

@interface SingletonSample : NSObject

// インスタンス変数
@property(assign, nonatomic) NSInteger num;
@property(strong, nonatomic) NSString *str;

// シングルトンパターンであることを定義
+ (SingletonSample *)sharedInstance;

// クラスメソッド
+ (void)testClassMethod;

// インスタンスメソッド
- (void)testInstanceMethod;

@end
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
34
35
36
37
38
39
40
41
// SingletonSample.mファイル
#import "SingletonSample.h"

@implementation SingletonSample

+ (SingletonSample *)sharedInstance
{
  static SingletonSample *sharedInstance = nil;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
      sharedInstance = [SingletonSample alloc] init];]
  });

  return sharedInstance;
}

- (id)init
{
  self = [super init];
  
  if(self) {
      // 初期化処理
      self.num = 10;
      self.str = @"テスト";
  }
  
  return self;
}

+ (void)testClassMethod
{
  NSInteger cnt = 20;
}

- (void)testInstanceMethod
{
  self.num = 30;
  self.str = @"TEST";
}

@end

さて、この定義したシングルトンのクラスを使ってみましょう。
適当にUIViewControllerクラスのViewController.mで使ってみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// ViewController.m
- (void)viewDidLoad {
  [super viewDidLoad];

  // インスタンス化
  [SingletonSample sharedInstance];
  // インスタンス変数を確認
  NSLog(@"num: %ld, str: %@", [SingletonSample sharedInstance].num, [SingletonSample sharedInstance].str);
  
  // クラスメソッドの実行
  [SingletonSample testClassMethod];
  // インスタンスメソッドの実行
  [SingletonSample sharedInstance] testInstanceMethod];
  
  // インスタンス変数
  NSLog(@"num: %ld, str: %@", [SingletonSample sharedInstance].num, [SingletonSample sharedInstance].str);]
}

ここまで書いた後にRunを実行すると、下記のログが出力されます。
2014-10-21 22:19:38.922 SingletonSample[4334:26435] num: 10, str: テスト
2014-10-21 22:19:46.986 SingletonSample[4334:26435] num: 30, str: TEST

正しく実行されていることがわかりますね。

このようにクラスメソッドは
[クラス名 メソッド名]
で呼び出します。

一方でインスタンスメソッドは
[インスタンス メソッド名
で呼び出します。
今回はシングルトンパターンであるため、シングルトンパターンのインスタンスである[SingletonSample sharedInstance]を用いていることに注意してください。

これからシングルトンのクラスをどしどし使いこなしていきたいと思います。

Comments