Andrew Madsenのソリューションに基づいて、私が使用することになったのは、オブジェクトごとに2つの異なるヘッダーファイルを用意することでした。1つはパブリックで、もう1つはプライベートでした。パブリックヘッダーには、開発者が読み取り専用プロパティにアクセスするために必要な情報のみが含まれています。次に、プライベートヘッダーはパブリックヘッダーをインポートし、SDK内で使用する必要のあるすべてのメソッド呼び出し(初期化子を含む)を含むカテゴリも含みます。次に、プライベートヘッダーを実装にインポートします。構造は次のようになります。
パブリックヘッダーMyObject.h
#import <Foundation/Foundation.h>
@interface MyObject : NSObject
@property (nonatomic, retain, readonly) NSString *myValue;
@end
プライベートヘッダーMyObject+Private.h
#import "MyObject.h"
@interface MyObject (Private)
+(MyObject*)MyObjectFromJSONString:(NSString*)JSONString;
-(id)initWithJSON:JSONString:(NSString*)JSONString
@end
プライベート実装MyObject.m
#import "MyObject+Private.h"
@implementation MyObject
@synthesize myValue = _myValue; //_myValue allows local access to readonly variable
- (id)init {
@throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"-init is not a valid initializer for the class MyObject" userInfo:nil];
return nil;
}
+(MyObject*)MyObjectFromJSONString:(NSString*)JSONString;
{
return [[MyObject alloc]initWithJSON:JSONString];
}
-(id)initWithJSON:JSONString:(NSString*)JSONString
{
self = [super init];
if(self){
//parse JSON
_myValue = JSONString;
}
return self;
}