我有一个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的第一步,请耐心等待。
感谢 苏尼特
答案 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中释放它们为止。
希望这能解决问题。