在静态库中,我有两个继承自NSObject的类A、B。我想在B的某些方法中创建A的对象。用户应该只能通过B访问A的引用,并且只能创建A和B的单个对象。当用户在他们的Xcode项目中添加静态库后,他们应该不能直接创建A的对象,由于这一点,我在A的初始化中引发了一个异常。但是,在这样做之后,我不能在B中创建A的对象。我不想创建A的共享实例,这将允许库用户在创建B之前访问A。我的主要目标是在B中创建A的对象,只有在创建B之后,用户才能通过B的属性访问A对象
@implementation A
//This will prevent library user to create A
- (instancetype)init {
[self doesNotRecognizeSelector:_cmd];
return nil;
}
@implementation B
- (void)initialiseSDK{
A *a = [B sharedA]; //won't work, A's init raises exception
+ (A *)sharedA{
static dispatch_once_t d;
static OncamAccount *sharedA = nil;
dispatch_once(&d, ^{
sharedA = [[A alloc]init]; //A's init raise exception
});
return shared;
}
+ (B *)sharedB{
static dispatch_once_t pred;
static OnCamSDK *sharedB = nil;
dispatch_once(&pred, ^{
sharedB = [[B alloc] init];
});
return sharedB;
}如果我从A的init中删除异常,那么我认为用户将能够直接创建A的对象,这是我不想要的。
发布于 2016-05-14 04:06:43
这里有另一个选项,可以让A更好地控制正在发生的事情:
在实现之外声明A.m中的变量。
static BOOL initialized = NO;
static NSLock *initLock;添加支持锁定的初始化代码。
+ (void)initialize
{
initLock = [[NSLock alloc] init];
}使init成为有条件的。
- (instancetype)init
{
[initLock lock];
if (initialized) {
[self doesNotRecognizeSelector:_cmd];
return nil;
}
initialized = YES;
[initLock unlock];
self = [super init];
return self;
}https://stackoverflow.com/questions/37217141
复制相似问题