Koichi Adachi

smart phone app development tips

private propertyにカテゴリからアクセスする

.hに書いてしまうと容易に外からアクセスできてしまうため、
.mにプライベートな変数を置くことがままあります。
ただ、それだとカテゴリで機能を拡張した場合にアクセスできないので、
どうしたもんかなーと思っていました。
ちょっと考えたらできました。

元クラス.h
 何も書かない
元クラス.m
 無名カテゴリを作る。
 無名カテゴリの中でプロパティ宣言をする。
 @interface MyClass()
  @property NSString* name;
 @end

カテゴリクラス.h
 import "元クラス.h"
カテゴリクラス.m
 元クラス.mと同じように、
  無名カテゴリを作る。
  無名カテゴリの中でプロパティ宣言をする。
 @interface MyClass()
  @property NSString* name;
 @end

これで元クラスで宣言したprivateなpropertyにアクセスできます。
※プロパティの宣言をカテゴリでもする必要があるのがダサいですが。

追記。外部クラスからは読めて、カテゴリからは書き換え可能なプロパティを作るには、

元クラスの.h  @property (readonly)NSString name;
元クラスの.m  無名カテゴリを作成し、その中で   @property (readwrite)NSString
name;

カテゴリクラス.h
 import "元クラス.h"
カテゴリクラス.m
 元クラス.mと同じように、
  無名カテゴリを作る。
  無名カテゴリの中で
  @property (readwrite)NSString* string

※元クラス.mの無名カテゴリでreadwriteを宣言していないと、
セッターが生成されないため、カテゴリからセットしようとすると落ちる。