2016-05-13 6 views
1

静的ライブラリでは、NSObjectから継承する2つのクラスA、Bがあります。私はBのいくつかのメソッドでAのオブジェクトを作成したいと思います。ユーザーはBを介してのみAの参照にアクセスでき、AとBの単一のオブジェクトのみを作成する必要があります。ユーザーが自分のXcodeプロジェクトに静的ライブラリを追加した後は、Aのオブジェクトを直接作成することはできません。そのため、Aのinitで例外が発生しています。しかし、これを実行した後、A Bでも。私はAの共有インスタンスを作成したくないので、Bを作成する前にライブラリユーザがAにアクセスできるようになります。私の主な目標は、Bが作成された後にのみ、内部のBのオブジェクトを作成することであると私は、その後、Aのinitから例外を削除した場合、ユーザーは、BAから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のオブジェクトを直接作成することができると思っています。これは私が望まないものです。

+0

あなたが公開していない 'init'の変形を' initForB'のように作成して、あなたの現在の 'init'をそのまま残すことができます。新しいものを呼びたい人がいるかもしれませんが、偶発的/偶発的な使用を止めようとするのであれば、うまくいく可能性があります。 (Objective-Cの "ハッカー"を阻止しようとしているのなら、それはもっと難しいでしょう) –

+0

この回答を確認してください:http://stackoverflow.com/questions/12000571/how-can-i-make-it-private-それはあなたが話していることに近いです。静的ライブラリ内のプライベートクラスを基本的に扱います。 – Putz1103

+0

@PhillipMills私はinitForB publicをAの内部で作成しないと、Bでどのようにアクセスするのですか?AからBを作成する方法はありません。 –

答えて

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; 
}