0

いくつかのデータ(いくつかのfloat、いくつかの文字列)をplistに保存してから、それらを読み戻しています。それらを読み返すとき、ビューコントローラのいくつかのivarに割り当てます。それらは単なるivarであり、プロパティではありません。

フロートはそれらの値をうまく取り、私はNSLogそれらを見ることができ、それらが正しいことを確認します。しかし、何を試しても、NSStringivarに文字列値を取得させることはできません。

例:配列の位置6と7には文字列がPortland, OR"あり"Pacific Daylight Time"、それらに格納されています-plistから読み戻して*array.

これ:

cityName = [NSString stringWithFormat:@"", [array objectAtIndex:6]];
timeZoneName = [NSString stringWithFormat:@"", [array objectAtIndex:7]];
NSLog(@" >cityName from array = %@, and now the iVar is = %@", [array objectAtIndex:6], cityName);
NSLog(@" >timeZoneName from array = %@, and now the iVar is = %@", [array objectAtIndex:7], timeZoneName);

この結果:

>cityName from array = Portland, OR, and now the iVar is = 
>timeZoneName from array = Pacific Daylight Time, and now the iVar is = 

これが発生するメソッドの最後にブレークポイントを設定し、両方のNSStringivarについて、小さなポップアップメッセージに次のように表示されます。Invalid Summary.

4

3 に答える 3

4
cityName = [NSString stringWithFormat:@"%@", [array objectAtIndex:6]];

間違いは、フォーマット指定子を見逃したことです。ただし、具体的には、配列内のオブジェクトがすでに文字列である場合は、それらをivarに直接割り当てることができます。

cityName = [array objectAtIndex:6];

ただし、オブジェクトの所有権には注意してください。によって返されるオブジェクトを所有していないobjectAtIndex:ため、このivarをさまざまなメソッドで使用する必要がある場合は、を送信して所有権を取得retainし、を使用して所有権を放棄しreleaseます。または、クラスの保持プロパティまたはコピープロパティとして確立することを選択した場合cityNameは、ドット表記またはアクセサーメソッドを使用します。

self.cityName = [array objectAtIndex:6];

// or

[self setCityName:[array objectAtIndex:6]];
于 2011-03-30T04:24:15.287 に答える
2

配列にNSStringインスタンスが含まれている場合、 を呼び出す必要はありません+stringWithFormat:。これは CPU サイクルの無駄であり、不変の文字列に関連する潜在的な最適化を元に戻します。さらに、 の結果に依存するdescriptionことは決して正しい答えではありません (ただし、NSStrings ではほぼ避けられませんが、これは結果に依存できる唯一の場所です)。

これ(修正済み):

cityName = [NSString stringWithFormat:@"%@", [array objectAtIndex:6]];
timeZoneName = [NSString stringWithFormat:@"%@", [array objectAtIndex:7]];

になり得る:

cityName = [array objectAtIndex:6];
timeZoneName = [array objectAtIndex:7];

必要に応じてコピーしてください。@dreamlax が言ったように、必ずメモリ管理ルールに従ってください。

于 2011-03-30T04:34:31.597 に答える
0

以下を使用してください

cityName = [NSString stringWithFormat:@"%@", [array objectAtIndex:6]];

整数には%dまたは%iを使用する必要があり、文字列オブジェクトには%@を使用します。

于 2011-03-30T04:25:21.763 に答える