2012-05-10 2 views
0

CFPreferencesCopyAppValue()メソッドで返されたNSArrayからオブジェクトへのアクセス/設定に問題があります。この場合、私のアプリケーションはクラッシュしますが、自分自身でa​​lloc/initを実行すると、すべてうまく動作します。NSArrayがアクセスするとアプリケーションがクラッシュする

CFArrayRef cfArray; 
    if ((cfArray = (CFArrayRef)CFPreferencesCopyAppValue(CFSTR("buttonsOrder"), appID))) { 
     NSArray *castedArray = [(NSArray *)cfArray retain]; 
     NSLog(@"castedArray : %@", castedArray); 
     buttonsOrder = [castedArray mutableCopy]; 
     NSLog(@"buttonsOrder : %@", buttonsOrder); 
     CFRelease(cfArray); 
     [castedArray release]; 
     castedArray = nil; 
    } 
    else { 
     buttonsOrder = [[NSMutableArray alloc] init]; 
     for (NSMutableDictionary *info in togglesInfo) { 
      [buttonsOrder addObject:[info objectForKey:@"buttonIdentifier"]]; 
     } 
    } 

PS:のNSLog()はCFArrayがうまく返され、あまりにもよくNSArrayの、その後NSMutableArrayのにキャストされていることを私に示しています。

編集:ここでは

私は配列をmodofy方法です:

- (void) tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { 
NSUInteger fromIndex = [fromIndexPath row]; 
NSUInteger toIndex = [toIndexPath row]; 
if (fromIndex == toIndex) 
    return; 
NSString *movedButtonId = [[[buttonsOrder objectAtIndex:fromIndex] retain] autorelease]; 
[buttonsOrder removeObjectAtIndex:fromIndex]; 
[buttonsOrder insertObject:movedButtonId atIndex:toIndex]; 

}

+2

NSUserDefaultsの代わりにCFPreferencesを使用している理由はありますか?また、クラッシュは実際にどこで起こりますか?クラッシュは何ですか? –

+0

その鋳造/保持を行う理由はありません。変更可能なコピーを取り出し、元の 'CFArray'を解放するだけでよいのです。 –

+0

です。私は現在のアプリケーションの設定にアクセスしていないので、私はNSUserDefaultsを使用することはできません(または私は現在のものの別のアプリケーションのための方法を知らない)。クラッシュは、配列にアクセスしようとしている(値を削除または追加しようとしている)ときに発生します。クラッシュによってアプリが終了します。 お返事ありがとう – DiAifU

答えて

0

にしようとすると、通常、あなたが意味することを、可変配列ににオブジェクトを追加しながら、あなたがクラッシュした場合nilオブジェクトを追加しようとしています。 CFPreferencesから有効な "cfArray"を取得しなかった場合は、変更可能な配列に何かを追加することがわかる唯一の場所(上記のコードスニペット内)があります。 "[info objectForKey:@"buttonIdentifier"]"がnilを返さないことを確認する必要があります。

例外をスローしていないことを確認してください。そうでない場合は、あなたのクラッシュが本当に何であるかを言います(Xcodeのコンソールログに表示されます)。

+0

有効なCFArrayを取得しなかった場合、すべて正常に動作し、アプリケーションは継続していて、[info objectForKey:@ "buttonIdentifier"]は決してnilではありません。クラッシュは、CFPreferences関数で初期化された配列からオブジェクトにアクセスする場合にのみ表示されます。 – DiAifU

+0

エラーは 'シグナル5:トレース/ BPTトラップ:5'です – DiAifU

+0

CFPreferencesで初期化された配列からオブジェクトにアクセスしている場合、そのコードはそこのスニペットにありません。変更可能な配列にアクセスする(追加または削除する)コードを表示するために質問を変更してください。 –

関連する問題