实例变量无法访问

时间:2010-12-23 12:00:15

标签: iphone exc-bad-access retain retaincount

严重的问题在这里...如果我尝试NSLog我的自定义对象的实例变量,我将获得ECX_BAD_ACCESS。在我的ViewController中调用以下函数,payload保存从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中定义,并在(.h)中设置为@property(非原子,保留)。:

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

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

如果我在theVCardN内的ViewController 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];
}

在调用NSLog输出“1”之前,theVCardN的RetainCounter。然后NSLog Line在调试器控制台中返回EXC_BAD_ACCESS。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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

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

它对调试毫无用处,而且它们是专门针对追踪这类问题的大量工具。

首先,如果发生崩溃,则会有回溯。发表它。在这种情况下可能不会那个有趣,但是,仍然,总是看向回溯至少确认它正在崩溃你认为它在哪里/如何。

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

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

答案 1 :(得分:0)

也许我正在读错代码或误解你的类结构,但看起来你正在记录:

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

上面,你说它仍在工作,你正在记录:

theVCard.PersonName.FirstName

你错过了“PersonName”吗?意思是你应该记录:

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