0

我正在做的是

    //ClassB.h
    @property (strong, nonatomic) NSString *name;

//ClassA.h
 @interface ClassA:NSObject
 +(ClassA*)methodA:(NSData*)data;
 -(id)initWithData:(NSData*) 数据;

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

    @结尾

    //ClassA.m
    @实现类A
    @synthesize arr;
    @synthesize rxmlRoot;

    +(ClassA*)methodA:(NSData*)data {
        返回 [[ClassA alloc] initWithData:data];
    }

    -(id)initWithData:(NSData*)data {
        self = [超级初始化];
        如果(自我){
            arr = [NSMutableArray 数组];
            rxmlRoot = [RXMLElement elementFromXMLData:data];

             /*****edit : 刚刚添加以使代码清晰*****/  
            NSString *node = @"players.player";
            [rxmlRoot 迭代:节点与:^(RXMLElement *e){
                 ClassB *classB = [[[ClassB alloc] init] autorelease];
                 [classB setName:[e属性:@“name”]];

                 // 将 ClassB 添加到 arr
                 [arr addObject:classB];
            }];

        }
        回归自我;
    }
    @结尾

所以现在我有ClassA对象,其arr包含ClassB

问题:稍后,当我尝试访问 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

问题中的代码已经发生了很大变化,所以我之前的回答现在没有意义,我已经删除了它。给定修改后的代码,首先要做的是记录发生了什么。

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

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

如果它在第一个日志语句中爆炸,事情就非常糟糕。但至少你知道 classA 指向的东西已经烂了,你可以从那里开始工作。

通过在行前设置断点并进行检查,您可以在调试器中实现相同的目的。假设您得到一个 EXC_BAD_ACCESS,其中一个指针指向一个狡猾的对象,例如一个已被释放的对象。看起来好像您正在使用 ARC(因为您的财产很强大),这应该有助于管理内存 - 但话又说回来,您在那里有一个自动释放,所以可能没有。

于 2012-05-08T17:33:53.507 回答
0

发布您的 ClassB.m 。您是否正在制作@synthesize 名称?

还要为 arr 制作 Alloc。

这行是错误的:

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

您的字符串称为 name ,而不是 firstName。它应该是 :

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