【问题标题】:instance variables not accessible实例变量不可访问
【发布时间】:2023-03-15 12:00:01
【问题描述】:

这里的严重问题...如果我尝试 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;
}

如果我在 ViewDidLoad 内的 ViewController aVCardViewController 中访问 theVCardN 对象,一切都会像魅力一样。我用该对象的数据设置了一些标签。

如果我随后尝试在从连接到 View 中的按钮的 IBAction 调用的函数中从 theVCardN 访问实例变量,我会在调试器控制台上收到 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];
}

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

有什么想法吗?

【问题讨论】:

  • 我猜是 vCard 设置不正确。
  • 在 NSLog 执行之前打印 gdb 中的值。你会知道真正的问题是什么。在调试模式下,将光标放在该行上。左键单击出现的黄色标签,然后单击打印说明。你可以看到值是多少。
  • 输出是:Printing description of theVCardN.FirstName: 仅此而已

标签: iphone exc-bad-access retain retaincount


【解决方案1】:

不要调用-retainCount。绝对保留计数没有用。

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

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

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

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

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

【讨论】:

  • 感谢您的帮助!将数据交给班级是一种模糊的“保留”。我重写了我的代码以遵循您提到的代码约定。谢谢!
【解决方案2】:

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

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

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

theVCard.PersonName.FirstName

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

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

【讨论】:

  • 不,在initWithVCard 我做theVCard = [aVCard retain]; theVCardN = [theVCard.PersonName retain]; 这样,VCardN 会从 aVcard 中加载“PersonName”对象。 (我认为应该这样做)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多