2012-02-08 12 views
0

私のXcodeのクラッシュログポイント:XCodeのクラッシュログNSMutableDictionaryナシチェック問題

それがnil 'のためにチェックされているので、私は、これはクラッシュしないことができると思っているだろう最初に '& &'と表示されます。前の行で失敗することはありますか?私は正確に同じ行番号を指す2つのクラッシュログを持っています。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
channelIndex = [[NSMutableArray alloc] init]; 

BOOL reachable = [self networkReachable]; 
if (!reachable) { 
    NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:kContent];  
    contentDict = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
    if(contentDict == nil || [contentDict count] == 0) { 
     contentDict = [[NSMutableDictionary alloc] init]; 
    } 
    data = [[NSUserDefaults standardUserDefaults] objectForKey:kHistory];  
    historyDict = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
    if(historyDict == nil || [historyDict count] == 0) { 
     historyDict = [[NSMutableDictionary alloc] init]; 
    } 
} 

if(selectedIndex == 0) { 
    if(contentDict != nil && [contentDict count] > 0) { 
     NSArray *keys = [contentDict allKeys]; 
     keys = [keys sortedArrayUsingSelector: @selector (compare:)]; 
     for (NSString *key in keys) { 
      NSLog(@"%@ is %@",key, [contentDict objectForKey:key]); 
      Content *content = [contentDict objectForKey:key]; 
      if (![channelIndex containsObject:content.channelName]) 
      {    
       [channelIndex addObject:content.channelName]; 
      }   
     } 
    } 
} else { 
    if(historyDict != nil && [historyDict count] > 0) { 
     NSArray *keys = [historyDict allKeys]; 
     keys = [keys sortedArrayUsingSelector: @selector (compare:)]; 
     for (NSString *key in keys) { 
      NSLog(@"%@ is %@",key, [historyDict objectForKey:key]); 
      Content *content = [historyDict objectForKey:key]; 
      if (![channelIndex containsObject:content.channelName]) 
      {    
       [channelIndex addObject:content.channelName]; 
      }   
     } 
    } 
} 
return [channelIndex count]; 

}

答えて

0

[NSKeyedUnarchiver unarchiveObjectWithData:data]は自動解放オブジェクトを返す:以下、それが由来する方法です。おそらくそれがあなたの問題です。結果を使用する前に保持してください。 nilをチェックすると、変数が自動的に解放されたために変数がゴミを含むメモリ領域を指している場合は役に立ちません。ネットワークに到達できないとき

+0

私はこれを行う必要があると仮定しています:contentDict = [[NSKeyedUnarchiver unarchiveObjectWithData:data] retain]; – beachbeamer

+0

私の所有物から「保持」属性を削除する必要がありますか? – beachbeamer

+0

最後に、NSUserDefaultsからオブジェクトを取得しただけで、NSKeydUnarchiverがNSMutableDictionaryにこれらの直列化されていないオブジェクトを配置していたので、私はそれを行う必要があると私には意味がありません。 – beachbeamer

0

あなたが提供するコードはcontentDictインスタンス変数を設定しているので、最初の質問は次のようになります。ネットワーク到達可能であるとき、それが設定取得する方法?おそらく、それは別の場所に設定されており、正しく保持されていないため、チェックを行う前にディクショナリの割り当てが解除されています。ここで

いくつかの提案は以下のとおりです。

  1. は、例えば、アンダースコアを使用してインスタンス変数の接頭辞contentDictではなく_contentDictです。
  2. init...,dealloc、およびゲッター/セッターのペア以外のメソッドで直接インスタンス変数を参照しないようにしてください。代わりにプロパティを使用します。
  3. nilのチェックは不要です。メッセージはnilには関係ありません。すべての非構造化戻り値型に対して0を返します。
  4. メモリ管理のルールを理解していることを確認してください。 ARCを有効にしてコンパイルする場合:Advanced Memory Mangement Programming Guide;そうでない場合:Transitioning to ARC Release Notes
関連する問題