0

小さなテキスト ファイルを解析する方法があります (以下のコードは簡略化されたバージョンです)。

- (void)parseFile:(NSString *)aFile
{
   NSDate *date;
   NSNumber *number;
   NSString *desc;

   NSString *txt = [NSString stringWithContentsOfFile:aFile encoding:NSUTF8StringEncoding error:nil];
   for (NSString *line in [txt componentsSeparatedByString:@"\n"]) {
      if ([linesubstring isEqual:@"mydate"]) {
         date = [dateFormat dateFromString:strDate];
      }

      if ([linesubstring isEqual:@"mynumber"]) {
         number = [numberFormat numberFromString:strValue];
      }

      if ([linesubstring isEqual:@"mydesc"]) {
         desc = [line substringWithRange:NSMakeRange(0, 10)];
      }

      if (!date && !number && !desc) {
         ...do something...
      }
   }
}

最初の問題は、変数がパラメーターdateの内容で満たされていることです。aFileが最初の if/check を通過するときに、それが正しい値であると想定するだけです。

なぜ?私はそれdateが予約語である可能性があると考えて交換しましたが、同じ動作でした。

2 番目の問題は、最後の if (ネストされたもの) にあります。コードをデバッグすると、xcode がそれを「範囲外」と表示していることがわかりますが、!number失敗します (xcode は有効であると考えています)...

[number isNotEqualTo:[NSNull null]](これはエラーEXC_BAD_ACCESSをスローします)のような他の組み合わせを試しましたが、成功しませんでした。

誰かヒントを教えてください。私はcocoa/objective-cの初心者です。私はJavaから来ています...

ティア、

ボブ

4

1 に答える 1

3

あなたが提供したコードにはかなりの数の問題があります。これをコメントにするのに十分なスペースがないため、回答ボックスを使用しています。

変数宣言に関して:

NSDate *date;
NSNumber *number;
NSString *desc;

それらを正しく宣言しましたが、初期化していません。そのままでは、ランダムなガベージを指している可能性があります。これは、ループの最後でのテストが…

if (!date && !number && !desc) {
   ...do something...
}

…実際には常に実行される可能性があるためdate、 , numberanddescは常に非ゼロになる可能性があります (可能性があると言うのは、それらがゼロか非ゼロかは実際には定義されていないためです)。nilそれらが設定されているかどうかを判断する予定がある場合は、それぞれを次のように初期化します。

NSDate *date = nil;
NSNumber *number = nil;
NSString *desc = nil;

変数を初期化する必要は必ずしもありません (たとえば、変数から読み取る前に書き込む場合は、初期化する必要はありません)。ただし、この未定義の動作を防ぐために、すべての変数を初期化するという考えを推進する人もいます。表面化します(とにかく初期化された値を上書きしても、通常はすべての変数を初期化します)。

また、呼び出された変数がありますlinesubstringが、コードのどこにも宣言されていません。同様にstrDatestrValueどこにも宣言されていません。これらがどのように宣言され、どのように使用されるかを知っておくことは重要です。

于 2010-12-13T04:01:36.560 に答える