0

CFPreferencesCopyAppValue() メソッドで返される 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にもキャストされることを示しています。

何か案が ?

編集 :

配列を変更する方法は次のとおりです。

- (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];

}

4

1 に答える 1

0

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

例外をスローしていないことを確認してください。そうでない場合は、実際のクラッシュの内容を教えてください (Xcode のコンソール ログに表示されます)。

于 2012-05-10T18:38:13.423 に答える