首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过阻止A从A直接访问来从B的方法内部创建单例对象A?

如何通过阻止A从A直接访问来从B的方法内部创建单例对象A?
EN

Stack Overflow用户
提问于 2016-05-14 02:38:23
回答 1查看 94关注 0票数 1

在静态库中,我有两个继承自NSObject的类A、B。我想在B的某些方法中创建A的对象。用户应该只能通过B访问A的引用,并且只能创建A和B的单个对象。当用户在他们的Xcode项目中添加静态库后,他们应该不能直接创建A的对象,由于这一点,我在A的初始化中引发了一个异常。但是,在这样做之后,我不能在B中创建A的对象。我不想创建A的共享实例,这将允许库用户在创建B之前访问A。我的主要目标是在B中创建A的对象,只有在创建B之后,用户才能通过B的属性访问A对象

代码语言:javascript
复制
@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的对象,这是我不想要的。

EN

回答 1

Stack Overflow用户

发布于 2016-05-14 04:06:43

这里有另一个选项,可以让A更好地控制正在发生的事情:

在实现之外声明A.m中的变量。

代码语言:javascript
复制
static BOOL initialized = NO;
static NSLock *initLock;

添加支持锁定的初始化代码。

代码语言:javascript
复制
+ (void)initialize
{
    initLock = [[NSLock alloc] init];
}

使init成为有条件的。

代码语言:javascript
复制
- (instancetype)init
{
    [initLock lock];
    if (initialized) {
        [self doesNotRecognizeSelector:_cmd];
        return nil;
    }
    initialized = YES;
    [initLock unlock];
    self = [super init];

    return self;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37217141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档