1

私は比較的新しい iPhone/objective-c プログラマーであり、自分の要素からかなり外れていると感じる問題があります。

他のメソッドでアクセスしようとしている辞書を作成するクラス メソッドを使用しようとしています。しかし、辞書には...より適切な用語がないため、トリッピンです。

DynamoDBManager.m のコードは次のとおりです (重要と思われる部分)。

    static NSMutableDictionary *voiceMap = nil;

    @implementation DynamoDBManager

    +(NSMutableDictionary *)createVoiceMap{
    NSLog(@"creating voice map...");
    if (voiceMap == nil){
        NSLog(@"Voice Map was nil");
        voiceMap = [NSMutableDictionary dictionaryWithObjects:[NSArray arrayWithObjects:
        @"piano", @"trumpet", @"hi_hat1", @"p", @"t", @"h", 
        @"acquitar", @"bass_drum1", @"clarinet", @"hi_tom", @"mid_tom", @"low_tom", @"crash_cymbal1", @"ride_cymbal1", @"snare_drum1", @"snare_drum2", @"violin", 
        @"g", @"b", @"c", @"i", @"m", @"l", @"y", @"r", @"s", @"a", @"v", nil] 
        forKeys:[NSArray arrayWithObjects:
        @"p", @"t", @"h", @"piano", @"trumpet", @"hi_hat1", 
        @"g", @"b", @"c", @"i", @"m", @"l", @"y", @"r", @"s", @"a", @"v", 
        @"acquitar", @"bass_drum1", @"clarinet", @"hi_tom", @"low_tom", @"mid_tom", @"crash_cymbal1", @"ride_cymbal1", @"snare_drum1", @"snare_drum2", @"violin", nil]];
    }
    NSLog(@"done creating voice map");
    return voiceMap;}

    +(NSString *)generateNoteCipherGivenX:(int)x Y:(int)y andNote:(id)theNote{
    NSLog(@"%@ -- voiceMap", voiceMap);
    NSString *voiceCipherString = [[DynamoDBManager createVoiceMap] objectForKey:[theNote getVoice]];
    if ([theNote isKindOfClass:[PitchedNote class]]) {
        int duration2 = [theNote getDuration];
        NSString *cipher = [NSString stringWithFormat:@"%@%i%i%i,", voiceCipherString, y+10, duration2, x];
        return cipher;
    }
    else{
        NSString *cipher = [NSString stringWithFormat:@"%@%i%i%i,", voiceCipherString, y, 0, x];
        return cipher;
    }
}

DynamoDBManager の別のメソッドで、私は呼び出します

 [DynamoDBManager generateNoteCipherGivenX:curX Y:curY andNote:curNote];

アプリの 3 つの異なる実行を含む、いくつかの奇妙なエラーが記録されています。

2012-08-10 21:53:48.090 createAccount[537:207] __NSCFDictionary -- type
2012-08-10 21:53:48.091 createAccount[537:207] {
IOProviderClass = IOFireWireUnit;
"Unit_SW_Version" = 16;
"Unit_Spec_ID" = 2599;
} -- voiceMap

2012-08-10 21:57:55.635 createAccount[580:207] __NSMallocBlock__ -- type
2012-08-10 21:57:55.636 createAccount[580:207] <__NSMallocBlock__: 0x810cb50> -- voiceMap

2012-08-10 22:38:10.044 createAccount[1188:207] -[__NSMallocBlock__ objectForKey:]: unrecognized selector sent to instance 0x77700e0
2012-08-10 22:38:10.044 createAccount[1188:207] Exception: -[__NSMallocBlock__ objectForKey:]: unrecognized selector sent to instance 0x77700e0

このような不安定な動作を得るには、信じられないほど間違ったことをしいるに違いありません。それは何ですか?

4

1 に答える 1

2

ARC(自動参照カウント)を使用していないに違いないので、辞書を保持する必要があります。

    voiceMap = [[NSMutableDictionary dictionaryWithObjects:[NSArray arrayWithObjects:
    @"piano", @"trumpet", @"hi_hat1", @"p", @"t", @"h", 
    @"acquitar", @"bass_drum1", @"clarinet", @"hi_tom", @"mid_tom", @"low_tom", @"crash_cymbal1", @"ride_cymbal1", @"snare_drum1", @"snare_drum2", @"violin", 
    @"g", @"b", @"c", @"i", @"m", @"l", @"y", @"r", @"s", @"a", @"v", nil] 
    forKeys:[NSArray arrayWithObjects:
    @"p", @"t", @"h", @"piano", @"trumpet", @"hi_hat1", 
    @"g", @"b", @"c", @"i", @"m", @"l", @"y", @"r", @"s", @"a", @"v", 
    @"acquitar", @"bass_drum1", @"clarinet", @"hi_tom", @"low_tom", @"mid_tom", @"crash_cymbal1", @"ride_cymbal1", @"snare_drum1", @"snare_drum2", @"violin", nil]] retain];

辞書を保持しないため、すぐに割り当てが解除され、voiceMap指しているメモリが他のオブジェクトに再利用される可能性が非常に高くなります。

于 2012-08-11T06:00:30.913 に答える