objective-cにおけるprotectedなpropertyの定義方法

Posted on
Objective-c iOS

privateなpropertyclass extensionを使えば良いですが、protected、即ちsubclassからもアクセスできるpropertyが欲しい場合どうするか。

Step 1: protectedなインスタンス変数をヘッダーで宣言

// SuperClass.h
@interface SuperClass: NSObject
{
  NSObject *_variable;
}
@end

superclassのヘッダーで、protectedなインスタンス変数を宣言します。

Step 2: SuperClassにもう一つヘッダーファイルを宣言

//SuperClass_protected.h
#import "SuperClass.h"

@interface SuperClass ()
@property (nonatomic , readonly) NSObject *variable;
@end

SuperClass.himportし、SuperClassclass extensionを使って、先ほど宣言したインスタンス変数に対応するpropertyreadonlyを指定して、宣言します。

Step 3: 実装ファイル(.m)でインスタンス変数とpropertyをsynthesize

// SuperClass.m
#import "SuperClass_protected.h"
@implementation SuperClass
@synthesize ivar = _ivar;
@end

参考

http://stackoverflow.com/questions/11047351/workaround-to-accomplish-protected-properties-in-objective-c

http://stackoverflow.com/questions/19321001/creating-properties-only-visible-to-subclass-in-objective-c