2010-12-23 111 views
0

严重问题在这里...我收到ECX_BAD_ACCESS如果我尝试NSLog我的自定义对象的实例变量。以下功能在我的ViewController中调用,​​保存从一个url拉取的字符串数据。实例变量不可访问

- (void) initVcardWithData:(NSString *)payload { 
    NSLog(@"1. initVcardWithData"); 
    aVCard = [[vcardItem alloc] initWithPayload:payload]; 
    VCardViewController *aVCardViewController = [[VCardViewController alloc] initWithVCard:aVCard]; 
    [self presentModalViewController:aVCardViewController animated:YES]; 
    [aVCard release]; 
} 

到目前为止好。该initWithWithVCard功能如下,theVCardtheVCardN在@implementation定义且还设置为@property(非原子,保留)在(.H)。:

-(id)initWithVCard:(vcardItem *)aVCard { 
    if(self = [super init]) { 
     theVCard = [aVCard retain]; 
     theVCardN = [theVCard.PersonName retain]; 
    } 

    NSLog(@"---- vCardViewController :: initWithVcard :: FirstName: %@", theVCard.PersonName.FirstName); 
    return self; 
} 

如果我在的ViewController访问theVCardN对象aVCardViewController以内ViewDidLoad一切都像一个魅力。我用来自该对象的数据设置了一些标签。

如果我然后尝试访问theVCardN中的实例变量,该函数从连接到View中按钮的IBAction中调用,我在调试器控制台上收到EXC_BAD_ACCESS错误。它试图从实例变量拉数据的功能如下:

-(IBAction)addressbookButtonTapped { 
NSLog(@"RETAIN COUNT FOR theVCard: %i", [theVCard retainCount]); 
NSLog(@"RETAIN COUNT FOR theVCardN: %i", [theVCardN retainCount]); 
NSLog(@"Save to Adressbook: %@", theVCardN.FirstName); 



//[self dismissModalViewControllerAnimated:YES]; 
} 

的RetainCounter为theVCardN右调用的NSLog输出“1”之前。 NSLog Line然后在Debugger Console中返回EXC_BAD_ACCESS。

有什么想法?

+0

我的猜测是vCard设置不正确。在NSLog执行之前 – Eiko 2010-12-23 12:22:19

+0

在gdb中打印值。你会知道什么是实际问题。在调试模式下,将光标放在该行上。左键单击出现的黄色标签并单击打印说明。你可以看到什么是价值。 – Raxit 2010-12-23 12:33:23

+0

输出结果是:`打印VCardN.FirstName的描述:`没有更多 – MadMaxAPP 2010-12-23 14:11:49

回答

1

不要调用-retainCount。绝对保留计数是无用的。

retainCount返回一个对象的绝对保留计数。实际值将是一个实现细节,通常完全超出了你的控制范围,因为系统框架可能会在内部执行任意数量的操作,导致保留计数以不期望的方式进行修改。

这对调试毫无用处,它们是专门关注这些问题的丰富工具。

首先,如果发生碰撞,有回溯。发表它。可能不是在这种情况下很有趣,但是,仍然总是期待回溯到至少确认它正在崩溃在哪里/你是怎么想的。

从发布的证据,它听起来像theVCardN.FirstName被设置为垃圾或底层的字符串已被过度释放。打开僵尸检测模式,看看是否是这种情况。由于它在FirstName上崩溃,因此显示与创建/存储FirstName相关的代码。

此外,实例变量和方法应始终以小写字母开头; PersonName应该是personName & FirstName应该是firstName

0

也许我读的代码错误或误解你的类结构,但它看起来像你登录:

NSLog(@"Save to Adressbook: %@", theVCardN.FirstName); 

以上,你说,这是仍在工作,你正在登录:

theVCard.PersonName.FirstName 

你是否缺少“PersonName”?意思是你应该记录:

NSLog(@"Save to Adressbook: %@", theVCardN.PersonName.FirstName);