基于 Andrew Madsen 的解决方案,我最终使用的是为每个对象设置两个不同的头文件;一种是公开的,一种是私人的。公共标头仅包含开发人员访问只读属性所需的信息。然后我的私有标头导入公共标头,还包含一个类别,其中包含我需要在 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;
}