0

私は基本的に、サーバーからデータをダウンロードして辞書に解析し、データの 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 とだけ言いたいのですが、それはクラッシュします。

4

3 に答える 3

0

「インスタンス」を設定する前に、再帰を呼び出しています。(OPから理解できるようになりました)。

ブロックでは、代わりにivarまたはアクセサーを使用できます

[SingletonClass sharedInstance] .contentDictionary

使用: _contentDictionary = [data copy];またはself.contentDictionary=data; contentDictionaryプロパティをサポートするivarが_contentDictionaryであると想定します。

self.contentDictionaryを試しても失敗したようですが、失敗しましたか?ARCをオンにしてテストで動作させることができたので、dataFetcherに何か影響がある可能性があります。私のテストでは、dataFetcherは単一の要素を持つ辞書を返すだけです。

于 2012-08-09T03:30:47.360 に答える
0

問題はさまざまなパーツにありました。URLが空になることがあり、データフェッチャーがすぐに失敗して、完了ブロックを呼び出していました。完了ブロックにはエラー処理を含めていなかったため、シングルトンクラスが初期化されていないと、永久に繰り返されていました。実際のURLでは、これは起こりません。

ただし、データをivarに割り当てようとすると、なぜクラッシュするのかを理解したいと思います。

于 2012-08-09T18:25:46.523 に答える
0

ブロックの外側で __block ディレクティブを使用して、ブロックで使用する変数を指定します。

__block NSDictionary *contentDictionary_;

[dataFetcher_ fetchDataWithURL:testURL completionHandler:^(NSDictionary *data, NSInteger error) {        
    contentDictionary_ = data;            
}];
于 2012-08-08T19:03:12.583 に答える