【问题标题】:BAD ACCESS error even though property is set to retainBAD ACCESS 错误,即使属性设置为保留
【发布时间】:2009-09-08 14:34:04
【问题描述】:

我希望有人能告诉我为什么我错了。这是我的代码的 sn-p:

TimeLogAppDelegate *appDelegate = (TimeLogAppDelegate *)[[UIApplication sharedApplication] delegate];

PickFromListViewController * pl = [[PickFromListViewController alloc] initWithNibName:@"PickList" bundle:nil];
pickList = pl;
[pickList setSearchItems:[appDelegate tableListMutableArray:type ] :NSLocalizedString(type,nil)];
pickList.callingViewController = self;
[pl release];
pickList.responseSelector = [[type lowercaseString] stringByAppendingString: @"Selected:"];
pickList.includeNone = YES;
pickList.includeNew = YES;
[self.navigationController pushViewController:pickList animated:YES];

如您所见,我在中途释放 pl 只是为了制造问题。 'pickList' 显然是一个 PickFromListViewController 并在 Header 中声明。我将它设置为一个属性(@property (nonatomic, retain) PickFromListViewController *pickList;)然后我 @synthesize 它。

我的问题是:

pl 发布后,我在访问 pickList 时遇到 BAD ACCESS 错误,表明指针不再可用,但我认为 pickList 是合成的,它会一直保留到我在 dealloc 时释放它?

谁能告诉我为什么我错了?

非常感谢

【问题讨论】:

  • 详细的明智问题,但问题标题没有提供任何关于您要问什么的线索......
  • 抱歉,谢谢 - 我没有意识到清楚问题的重要性。

标签: iphone


【解决方案1】:

pickList 属性设置为(nonatomic, retain) 仅适用于通过属性访问器访问该属性的情况,如下所示:

self.pickList = P1;

[self setPickList:P1];

如果只是给成员变量赋值:

pickList = P1;

您正在绕过属性访问器方法,因此不会发送 retain 消息。

【讨论】:

  • 非常感谢。我现在看到我需要返回通过我的代码来解决这个问题。关于这一点的另一件事;对我来说 self.pickList = P1 和 pickList = P1 说同样的话。你能想出一种方法来理解这两个陈述的含义吗? (如果你明白我的意思:)
  • 我在设置属性值时倾向于使用方括号语法。点语法可能看起来更简洁一些,但我发现这样更容易记住。当我看到 var = value 时,我知道我正在直接访问该成员。当我看到 [self setVar:value] 时,我知道正在使用访问器。
  • 感谢您解释这一点和您的时间 - 克里斯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 2011-01-16
相关资源
最近更新 更多