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機能がオンになっています!私が使用しているシングルトンの場合
:// 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つのオブジェクトを持っているという事実に基づいているということです。これが役立つかどうかを確認するために、通信を「スター型」に再ルーティングします。
1)クラッシュのエラーは何ですか? 2)デリゲートとシングルトンはお互いに関係がありません。それらは完全に独立した独立した2つの概念です。 3)なぜ '@ synthesize'を使用していますか? '@ synthesize'を使用する古いチュートリアルに従ってはいけません(ほとんどの場合)。 – rmaddy
+1は合成を使用しないためです。提示したコードにクラッシュはありません。 'PlayerInterface'オブジェクトの初期化に何か問題がある可能性があります。 – CharlesThierry
クラッシュログの+1。クラッシュそのものについてもっと知らずに助言することはほとんどできません。 @CharlesThierryが上で述べたように、上に掲示したコードは潜在的なクラッシュを実際には表示しないので、別の場所にあるように見えます。しかし、メモとして。シングルトンは限られた使用しかしてはいけません。彼らが価値あるものよりも多くの問題を引き起こすことが多いので、注意が必要です。 – dlbuckley