【Objective-C】インスタンス変数を正しく宣言するべき場所はどこなのか。

こういう人に向けて発信しています。
・インスタンス変数を宣言するべき場所がわからない人
・プロパティとインスタンス変数が分からない人
・Objective-C中級者

結論:ほとんどの場合で実装部分(.m)に書くべき。

#import "ViewController.h"

@interface ViewController ()


//実装ファイルのクラスエクステンションでの宣言
//例:基本的には本クラスのインスタンスからしか呼び出せない。(private)
//例外:カテゴリクラスからは参照可能。(クエスエクステンションで調べてみてね)
@property (nonatomic,strong) NSString *strB;


@end

@implementation ViewController

- (void)viewDidLoad {
   [super viewDidLoad];
}


@end

外部公開する必要がないインスンタンス変数を宣言する事によって、
外部から参照できてしまい、内容を書き換えてしまったり、
また、予測候補で入力して間違った処理を誤字が原因で怒ったりもするので、外部クラスに公開する必要ない変数は.mファイルに書くべき。

インスタンス変数が宣言できる場所を整理:3パターン

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
//hクラスでの外部公開クラス (public)
//例:別のクラスから本クラスを初期化した際に  .strA で参照出来る。
@property (nonatomic,strong) NSString *strA;

@end
#import "ViewController.h"

@interface ViewController ()


//実装ファイルのクラスエクステンションでの宣言
//例:基本的には本クラスのインスタンスからしか呼び出せない。(private)
//例外:カテゴリクラスからは参照可能。(クエスエクステンションで調べてみてね)
@property (nonatomic,strong) NSString *strB;


@end

@implementation ViewController

- (void)viewDidLoad {
   [super viewDidLoad];
}


@end

パターン1:ヘッダーファイルのインスタンス変数宣言

メリット:
外部クラスから参照出来るので、外部クラスにて初期化した際に、
本クラスのインスタンスにドット演算子で参照出来る。

例:  AViewController *aVC = [[AViewController alloc]init];
      aVC.strA = @"strA"


デメリット:
特になし。外部クラスからの参照が不要な場合は参照できてしまう、ぐらいか。

パターン2:クラスエクステンションでのインスタンス変数宣言

メリット:
後述するパターン3とは異なり、viewContoller内だけではなく、
複数のカテゴリからクラスエクステンションに書いたインスタンス変数は参照することができる。

デメリット:
複数カテゴリから参照できてしまうので想定しにくいが、
値が書き換わるなど想定外で気づきにくいミスが起こる可能性がある。
(ちゃんと管理できていない場合です。大抵はカテゴリクラスから1つの変数を操作して全体で値を持つ運用をします)


この記事が気に入ったらサポートをしてみませんか?