2016-12-19 9 views
0

obj-cの新機能で、ランダムクラッシュの原因となるシングルトンが多数使用されている既存のコードを再作成しています。私はそれらのほとんどを適切なプロトコルに置き換えましたが、依然としてONEデリゲートのリファレンスを設定するのには苦労しています。私はシングルトンとプロトコルについていくつかの記事を読んでおり、apple docsも参照していますが、もっと読むほど私は混乱します。私は気づいていない副作用があると推測します。iOS - シングルトンを使用してデリゲートリファレンスを実装する際の問題

デリゲート参照を設定する必要があるのは、PlayerInterfaceインスタンスのID(ポインタアドレス)です。ここで

は、私がこれまで何をしたかである:ここでは

// define delegate in DocumentsViewController.h 
@property (weak, nonatomic) id <documentsProtocol> delegate; 

// in DocumentsViewController.m 
// set delegate reference using singleton 
self.delegate = [PlayerInterface sharedInstance]; // here it crashes! 

は、私はそれが上のクラッシュシングルトンでデリゲートの参照を設定し、私が直面してる現在の問題は、あります糸。 ARC機能がオンになっています!私が使用しているシングルトンの場合

crash-log

// in PlayerInterface.m (NSObject) 
+ (instancetype)sharedInstance 
{ 
    static dispatch_once_t once; 
    static id sharedInstance; 
    dispatch_once(&once, ^{ 
     sharedInstance = [[self alloc] init]; 
    }); 
    return sharedInstance; 
} 

/// /// 1.EDIT

私はシングルトンの初期化について尋ねた - 私のMainViewControllerにPlayerInterfaceオブジェクトは初めてインスタンス化されます。

- (void)viewDidLoad { 
    self.player = [PlayerInterface sharedInstance]; 
} 

I 'また、dispatch_onceを回避しようとしました:

- (void)viewDidLoad { 
    PlayerInterface *play = [[PlayerInterface alloc] init]; 
    self.player = play; 
} 

しかし、違いはありません...またクラッシュする!助けることができる人は誰ですか?

/// /// 2.EDIT

私は奇妙な回避策を試してみた:PlayerInterface私はIDグローバル変数にする最初の時間をインスタンス化すると(私はこれはオブジェクトの考えに反対であることを知っていますプログラミング)。

extern id play; 

それは私が今簡単に使用して基準値を設定することができます委任に来る:それは魔法のように動作

self.delegate = play; 

を、単に古き良きC-スタイル:)

私は仮定シングルトンの問題は、私が互いにコミュニケーションする3つのオブジェクトを持っているという事実に基づいているということです。これが役立つかどうかを確認するために、通信を「スター型」に再ルーティングします。

+3

1)クラッシュのエラーは何ですか? 2)デリゲートとシングルトンはお互いに関係がありません。それらは完全に独立した独立した2つの概念です。 3)なぜ '@ synthesize'を使用していますか? '@ synthesize'を使用する古いチュートリアルに従ってはいけません(ほとんどの場合)。 – rmaddy

+0

+1は合成を使用しないためです。提示したコードにクラッシュはありません。 'PlayerInterface'オブジェクトの初期化に何か問題がある可能性があります。 – CharlesThierry

+0

クラッシュログの+1。クラッシュそのものについてもっと知らずに助言することはほとんどできません。 @CharlesThierryが上で述べたように、上に掲示したコードは潜在的なクラッシュを実際には表示しないので、別の場所にあるように見えます。しかし、メモとして。シングルトンは限られた使用しかしてはいけません。彼らが価値あるものよりも多くの問題を引き起こすことが多いので、注意が必要です。 – dlbuckley

答えて

0

デリゲートは、他のオブジェクトと同様に、IDやその他のプロパティを問い合せることができる単なるオブジェクトです。あなたの "documentsProtocol"に "tellMeYourID"メソッドを追加すると、あなたはビジネスに慣れています。

+0

私はこれが "鶏卵/卵"の問題だと思っています...それを知らずにインスタンスIDでデリゲートリファレンスを設定する方法は? – Hecot

+0

"インスタンスID "?あなたは私とは違う意味を付けているようです。 –

0

私は、プロトコルによって互いに通信する3つのオブジェクトを持っていました。たとえ私が委任ループで終わらないように注意を払ったとしても、これが問題を引き起こしたようです。通信を「スター型」に戻した後は、すべての問題が解消されます。現在、各オブジェクトは他のオブジェクトと通信しています。MainViewControllerは途中で主人と私は情報を渡す必要がある場合、私は次のように短いメソッドを追加しました:私は、これは完璧なソリューションであれば知っているが、グローバル変数を使用するよりもはるかに優れていない

// passing through MainVC to keep star type communication 
- (void)updateList:(NSArray)list { 
    [self.player setList:list]; 
} 

ことプレーヤーインスタンスのIDを保持しています:)

関連する問題