2009-11-22 107 views
1

我有一个地址接口这样的:获取“EXC_BAD_ACCESS”

@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的第一步,请耐心等待。

感谢 苏尼特

+2

我没有看到任何会在您发布的代码中导致该错误的内容。我发现使用UTF8String而不是仅仅打印字符串本身是可疑的,但是这与任何正在耗尽的池不应该有任何关系。更可能的错误是在这个类被使用的地方。 – Chuck 2009-11-22 06:04:41

回答

2

由于发生错误排水池时,我可能会怀疑你已经释放由该点的对象,对象是过度释放(虽然通常你会得到一个“malloc double free”错误)或者内存已被其他东西覆盖。我建议在启用僵尸的情况下运行它,如this answer - 如果您有Snow Leopard,则可以使用Xcode的运行菜单中的乐器中的僵尸工具。祝你好运!

1

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

正如其他人所建议的,您可能需要寻找额外的'释放'电话。

-1

既然你释放你的dealloc方法中的字符串这样看来,你的AddressCard对象假定字符串的所有权,但你用这条线来定义的性质在:

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

使用拷贝意味着你的目标是不保留字符串。尝试更改该行:

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

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

希望能解决问题。

+0

不正确。 'copy'属性意味着它调用'-copy'消息并假定副本的所有权。你正在考虑'assign',它被用于基元和代表等。 – 2009-11-22 16:46:51

+0

是的,我的错误,我正在考虑分配。道歉。 – 2009-11-24 02:43:48