2016-05-13 24 views
1

在静态库中,我有两个类A,B继承自NSObject。我想在B的某些方法中创建A的对象。用户应该只能通过B访问A的引用,并且只应创建A和B的单个对象。用户在他们的Xcode项目中添加静态库后,他们不应该直接创建A的对象,因此我在A的init中引发了一个异常。但是,在完成此操作后,我无法创建A的对象在B也。我不想创建A的共享实例,它允许库用户在创建B之前访问A.我的主要目标是创建一个内部B的对象,只是创建后,B和用户应该能够通过对B如何通过阻止A从A直接访问来从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的对象,这是我不想要的。

+0

你可以创建一个你不公开的'init'的变体,像'initForB'一样保留当前'init'。有人想打电话给这个新人可能会想出来,但是,如果你只是试图阻止偶然/意外使用,它可以工作。 (如果你想阻止Objective-C“黑客”会更困难。) –

+0

检查这个答案:http://stackoverflow.com/questions/12000571/how-can-i-make-it-private-成员或类的方法,所以它可以被访问它接近你在说什么。基本上处理静态库中的私有类。 – Putz1103

+0

@PhillipMills如果我没有在A中公开使用initForB,我将如何在B中访问它,因此我将如何从B创建A. –

回答

0

这里的另一种选择,让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; 
} 
相关问题