获得“EXC_BAD_ACCESS”

时间:2009-11-22 05:40:14

标签: objective-c

我有一个Address接口:

    @interface AddressCard : NSObject 
{
    NSString *name;
    NSString *email;
}

@property (copy, nonatomic) NSString *name, *email;

-(void) print;
-(void) setName:(NSString *) theName andEmail:(NSString *) theEmail;
-(void) dealloc;
@end

实施为:

#import "AddressCard.h"

@implementation AddressCard

@synthesize name, email;

-(void) setName:(NSString *) theName andEmail: (NSString *) theEmail
{
    self.name = theName;
    self.email = theEmail;
}
-(void) print
{
    NSLog (@"==============================");
    NSLog(@"| %-21s |", [self.name UTF8String]);
    NSLog(@"| %-21s |", [self.email UTF8String]);
    NSLog (@"==============================");
}

-(void) dealloc
{
    [name release];
    [email release];
    [super dealloc];
}

@end

当我运行它时,我在池中消耗时继续获得EXEC_BAD_ACCESS。我无法找到原因,任何帮助表示赞赏。这是我进入Objective-C的第一步,请耐心等待。

感谢 苏尼特

3 个答案:

答案 0 :(得分:2)

由于在排空池时发生错误,我可能会怀疑你已经解除了该对象的对象,并且该对象被过度释放(尽管通常你会得到一个“malloc double free”错误这个)或者内存已经被别的东西覆盖了。我建议在启用僵尸的情况下运行它,如this answer - 如果你有Snow Leopard,你可以使用Xcode的运行菜单中的Zombies工具。祝你好运!

答案 1 :(得分:1)

这个例子看起来很熟悉 - 我自己刚刚完成了这本书!您上面发布的代码很好,所以问题必须在其他地方。您可以尝试签出the author's forum - 该章的每个步骤的源代码都会发布在那里。

正如其他人所建议的那样,您可能希望寻找额外的“释放”电话。

答案 2 :(得分:-1)

由于您在dealloc方法中释放字符串,因此看起来您的AddressCard对象假定字符串的所有权,但您使用此行来定义属性:

@property (copy, nonatomic) NSString *name, *email;

使用复制意味着您的对象不会保留字符串。尝试将该行更改为:

@property (retain, nonatomic) NSString *name, *email;

使用retain意味着您的对象将保留字符串,直到您在dealloc中释放它们为止。

希望这能解决问题。