Objective c 获取“;EXC#u坏访问”;

Objective c 获取“;EXC#u坏访问”;,objective-c,Objective C,我有一个地址接口,如下所示: @interface AddressCard : NSObject { NSString *name; NSString *email; } @property (copy, nonatomic) NSString *name, *email; -(void) print; -(void) setName:(NSString *) theName andEmail:(NSString *) theEmail; -(void) deall

我有一个地址接口,如下所示:

    @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\u BAD\u访问权限。我无法找到原因,非常感谢您的帮助。这是我进入Objective-C的第一步,请耐心等待

谢谢
Sunit

由于错误发生在清空池时,我可能怀疑您在该点之前已经释放了对象,并且该对象被过度释放(尽管通常会出现“malloc double free”错误),或者内存已经被其他内容覆盖。我建议在启用僵尸的情况下运行它,比如-如果你有雪豹,你可以在Xcode的运行菜单的仪器中使用僵尸工具。祝你好运

这个例子看起来很熟悉——我自己刚看完那本书!您在上面发布的代码很好,因此问题一定在其他地方。您可以尝试签出-该章的每个步骤的源代码都发布在那里


正如其他人所建议的,您可能希望寻找额外的“release”调用。

因为您在dealloc方法中释放字符串,所以您的AddressCard对象似乎拥有字符串的所有权,但您使用此行来定义属性:

@property (copy, nonatomic) NSString *name, *email;
使用“复制”表示对象不保留字符串。尝试将该行更改为:

@property (retain, nonatomic) NSString *name, *email;
使用retain意味着您的对象将保留字符串,直到您在dealloc中释放它们


希望这能解决问题。

我在您发布的代码中没有看到任何会导致该错误的内容。我发现UTF8String的使用而不仅仅是打印字符串本身是可疑的,但这与任何池的排水无关。错误更可能出现在使用此类的位置。不正确。
copy
属性意味着它调用
-copy
消息并承担副本的所有权。您想到的是
assign
,它用于原语和委托等。是的,我错了,我想到的是assign。道歉。