0

这里有严重的问题......如果我尝试 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 (nonatomic, retain):

-(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在我的 ViewControlleraVCardViewController中访问对象,那么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 之前的 RetainCountertheVCardN输出“1”。然后 NSLog 行在调试器控制台中返回 EXC_BAD_ACCESS。

任何的想法 ?

4

2 回答 2

1

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

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

它对调试毫无用处,它们有大量专门用于追踪此类问题的工具。

首先,如果发生崩溃,则有一个 backtrace。发表它。在这种情况下可能不是那么有趣,但是,仍然要始终查看回溯以至少确认它在您认为的位置/方式崩溃。

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

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

于 2010-12-23T16:01:41.313 回答
0

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

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

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

theVCard.PersonName.FirstName

您是否缺少“人名”?意味着您应该记录:

NSLog(@"Save to Adressbook: %@", theVCardN.PersonName.FirstName);
于 2010-12-23T13:39:50.650 回答