1

ヘッダーファイル:

@interface Picker : UITableViewController <NSXMLParserDelegate> {
    NSMutableString *currentRow;
}
@property (nonatomic, retain) NSMutableString *currentRow;

@end

実装ファイル:

#import "Picker.h"

@implementation Picker

@synthesize currentRow;

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        currentRow = [[NSMutableString alloc] initWithString:@"VehicleYear"];
    }
    return self;
}
@end

これをデバッグし、currentRowが文字列で初期化される場所にステップインした後。ステートメントにカーソルを合わせてからcurrentRowにカーソルを合わせると、値に「InvalidSummary」と表示されます。実際のメモリ参照ではなく、0x33112のようなアドレス参照を取得するため、ポインタを取得しているように見えます。何をしても、このプロパティで有効な文字列を取得できないため、すべての比較が失敗します。私は何が間違っているのですか?

4

2 に答える 2

4

これがそれと関係があるかどうかはわかりませんが、initWithString:メソッドのドキュメントを読むと、サブクラスのインスタンスが返されます。このサブクラスのNSStringインスタンスは、NSMutableString

代わりにこれを試してください、それはあなたが望むことをします:

currentRow = [@"VehicleYear" mutableCopy];

また、99%の場合、次のように宣言するクラスの文字列プロパティが必要です。

@property(readwrite,copy)NSString *name;

読み取り/書き込み文字列プロパティをコピー以外のものとして宣言すると、それを設定した人は誰でも文字列を変更してオブジェクトの内部状態に影響を与える可能性がありますが、これは通常、必要なものではありません。元の文字列が変更可能でない場合、そのコピーメソッドはとにかく保持を行うため、問題が発生した場合にパフォーマンスが失われることはありません。

外部ユーザーが変更できない内部で変更可能な文字列が必要な場合は、おそらく次のようにプロパティを宣言する必要があります。

@property(readwrite,copy)NSString *name;

-name次に、自分自身を実装し-setName:て、呼び出し-mutableCopyて設定-copyし、ゲッターで内部状態を変更できないようにします。私はこれについて私のブログに広範囲に書いています。

これに注意してください

@property(readwrite,copy)NSMutableString *name;

-copyセッターが呼び出して結果としてNSMutableStringではないNSStringを取得するときに、アクセサーを@synthesizeすると、誰もが望んでいることを実行しません。

于 2011-02-11T16:28:10.133 に答える
1

ビジュアルデバッガーから誤った情報を取得することがあります。gdbコンソールで、「print-obj currentRow」と入力すると、より適切な情報が得られるはずです。

確認すべきことの1つは、最適化をオフにしてビルドをデバッグしていることです(つまり、リリースではなくデバッグ、構成)。そうしないと、コードがコンパイルされた命令に正確にマップされません。

于 2011-02-11T16:41:19.350 に答える