0

あるView Controllerから別のView Controllerに渡すことができる他の関連情報とともに、解析されたXMLデータを含む1つの「深い」NSMutableDictionaryを構築しました。NSMutableDictionary には主に NSString が含まれていますが、さらに別の NSMutableDictionary にも NSString が含まれており、最終的にカスタム オブジェクトの NSMutableArray がさらに深く続きます (これはカレンダー用です)。

さて、これはカレンダーなので、明らかに日付が関係しています。私が受け取って NSXMLParser を使用して解析した XML データは文字列を返すので、その日の日付を使用可能な数値に変換するのは私の責任でした。XML の日付は、次の形式で提供されます: "MM.DD" そのために、次のメソッドを作成しました。

- (void)createDateCodesWithString:(NSString *)string 
{ 
   NSInteger monthCode;
   NSInteger dayCode;
   ....
   NSArray *dates = [string componentsSeparatedByString:@"."];
   monthCode = [[dates objectAtIndex:0] integerValue];
   dayCode = [[dates objectAtIndex:1] integerValue];
   ....
   shortDay = [NSNumber numberWithInt:dayCode];
}

「shortDay」は NSNumber* と ivar であり、作成したカスタム オブジェクトのプロパティ (非アトミック、保持) として設定されます。コンソールで NSLog コマンドを実行すると、「shortDay」およびその他のデータが深い NSMutableDictionary に正常に保存されているように見えます。しかし、データに再度アクセスしようとすると、問題が発生します。NSString* に保存された ivar にアクセスすると問題なく動作しますが、NSNumber* にアクセスしようとすると、コード 1 またはコード 2 で EXC_BAD_ACCESS エラーが発生します。これが、NSNumber* を呼び出そうとする方法です。

   NSNumber *number = day.shortDay;
   return [number stringValue];

問題は、NSArray *dates が文字列を月と日の文字列に分割し、2 文字の長さの日の文字列の前に「0」が含まれている可能性があるためです。たとえば、日が月の 6 日である場合は「6」です。 ? 何かアドバイス?

必要に応じて、より多くのコードを投稿できれば幸いです。

4

1 に答える 1

1

のメモリshortDayは、次にアクセスしようとする前にクリーンアップされている可能性があります。割り当てるときは、代わりにこれを試してください:

shortDay = [[NSNumber numberWithInt:dayCode] retain];

メモリの割り当てが早すぎるのを避けるために、参照カウントを増やします (オブジェクトの所有権を取得することもできます)。

これで問題が解決した場合は、クラス[shortDay release]deallocメソッドを呼び出して、そのメモリが適切なタイミングで適切に解放されるようにする必要があります。

于 2012-04-26T15:34:59.570 に答える