0

私がしていることは

    //ClassB.h
    @property (強力、非アトミック) NSString *name;

//ClassA.h
 @interface ClassA : NSObject
 +(ClassA*)methodA:(NSData*)データ;
 -(id)initWithData:(NSData*)データ;

    @property (nonatomic, strong) NSMutableArray *arr;
    @property (nonatomic, strong) RXMLElement *rxmlRoot;

    @終わり

    //ClassA.m
    @実装 ClassA
    @synthesize arr;
    @synthesize rxmlRoot;

    +(ClassA*)methodA:(NSData*)データ{
        return [[ClassA alloc] initWithData:data];
    }

    -(id)initWithData:(NSData*)データ{
        自己 = [スーパー初期化];
        もし (自己) {
            arr = [NSMutableArray 配列];
            rxmlRoot = [RXMLElement elementFromXMLData:データ];

             /*****編集: コードを明確にするために追加されました*****/  
            NSString *node = @"players.player";
            [rxmlRoot iterate:node with:^(RXMLElement *e){
                 ClassB *classB = [[[ClassB alloc] init] autorelease];
                 [classB setName: [e属性:@"名前"]];

                 // ClassB を arr に追加する
                 [arr addObject:classB];
            }];

        }
        自分自身を返します。
    }
    @終わり

だから今私はarrがClassBを含むClassAオブジェクトを持っています

質問: 後で、ClassB の特定のプロパティにアクセスしようとすると、

((ClassB*)[classA.arr objectAtIndex:0]).name

そして、上記の行でEXC_BAD_ACCESSを取得しています..

この問題とエラーの修正方法についてアドバイスをください。コメントはこちらで受け付けます

ありがとう

4

3 に答える 3

1

この行

[arr addObject:ClassB]

意味がありません。ClassBのインスタンスをその配列に入れるつもりですか、それともクラス自体(つまり[ClassB class])ですか?おそらく、ClassBのインスタンスをそこに配置することを意図している必要があります。そうしないと、後でそのプロパティにアクセスしようとしてfirstNameも意味がありません(たとえば)。また、ClassBにはfirstNameプロパティもありますか。これは、表示するClassBのインターフェイスの一部がプロパティについてのみ言及しているためnameです。

アップデート:

手動のメモリ管理を使用しているため、自動解放されたオブジェクトを返す便利なコンストラクターを使用して、初期化子で作成したオブジェクト(arr、rxmlRoot)を保持する必要があります。たとえば、コードは次のようになります

arr = [[NSMutableArray array] retain];
于 2012-05-08T17:36:52.503 に答える
0

あなたの ClassB.m を投稿してください。@synthesize の名前を作っていますか?

また、arrの割り当てを行います。

この行はとても間違っています:

((ClassB*)[classA.arr objectAtIndex:0]).firstName

あなたの文字列は、 firstName ではなく name と呼ばれます。そのはず :

((ClassB*)[classA.arr objectAtIndex:0]).name
于 2012-05-08T17:55:27.930 に答える
0

質問のコードが大幅に変更されたため、以前の回答は意味をなさず、削除しました。改訂されたコードが与えられた場合、最初に行うことは、何が起こっているかをログに記録することです。

NSLog(@"classA: %@", classA);
NSLog(@"classA.arr: %@", classA.arr);

((ClassB*)[classA.arr objectAtIndex:0]).name

最初のログ ステートメントでエラーが発生した場合、状況は非常に悪くなります。しかし、少なくとも classA が何か腐ったものを指していることがわかるので、そこから戻ることができます。

行の前にブレークポイントを設定して検査することにより、デバッガーで同じことを実現できます。EXC_BAD_ACCESS を取得している場合、ポインターの 1 つが危険なオブジェクト (解放されたオブジェクトなど) を指しています。ARC を使用しているかのように見えますが (プロパティが強力であるため)、メモリの管理に役立ちますが、そこには自動解放があるため、そうではない可能性があります。

于 2012-05-08T17:33:53.507 に答える