私は基本的に、サーバーからデータをダウンロードして辞書に解析し、データの NSDictionary を返す、より洗練された NSURLConnection クラスを実装しています。(デリゲート オプションに加えて) 完了ブロック オプションを追加しようとしていますが、そのデータを別のクラスに保存しようとするとクラッシュします。
[dataFetcher_ fetchDataWithURL:testURL completionHandler:^(NSDictionary *data, NSInteger error) {
contentDictionary_ = data;
}];
そのデータは問題なく NSLog でき、基本的には何でも好きなように処理できますが、別の変数に保存しようとするとすぐに、非常にあいまいなメッセージでクラッシュします。
編集: クラッシュ メッセージは EXC_BAD_ACCESS ですが、スタック トレースは 0x00000000 エラーです: アドレスには、オブジェクト ファイル内のセクションを指すセクションが含まれていません。
シングルトンの init メソッドでこの関数を呼び出しています。これを完了ブロックに設定すると、データを保存できます。
[SingletonClass sharedInstance].contentDictionary = data
しかし、sharedInstance がまだ返されていないため、アプリは永遠に動かなくなります。そのため、シングルトン オブジェクトはまだ nil であるため、完了ブロックの sharedInstance は init を何度も何度も呼び出します。
編集 2: シングルトン コードは次のようになります。
+ (SingletonClass*)sharedInstance {
static SingletonClass *instance;
if (!instance) {
instance = [[SingletonClass alloc] init];
}
return instance;
}
- (id)init {
self = [super init];
if (self) {
dataFetcher_ = [[DataFetcher alloc] init];
NSString *testURL = @"..."
[dataFetcher_ fetchDataWithURL:testURL completionHandler:^(NSDictionary *data, NSInteger error) {
[SingletonClass sharedInstance].contentDictionary = data;
}];
}
return self;
}
私が言ったように、これは問題なく動作しますが、アプリがクラッシュするまで初期化コードを何度も繰り返します。これは、返されたデータをキャッシュし、データがキャッシュされるとクラッシュしないため、デバイスでアプリを初めて実行したときにのみ発生します。self.contentDictionary = data とだけ言いたいのですが、それはクラッシュします。