【发布时间】:2011-10-09 16:26:30
【问题描述】:
我是 Objective C 的新手,我真的需要一些帮助。
我创建了一个名为 Agent 的类。 Agent 类包含以下方法:
+ (Agent *)agentWithName:(NSString*)theName {
Agent *agent = [[[Agent alloc] init] autorelease];
agent.agentName = theName;
return agent;
}
然后从我的根视图控制器中,我想循环遍历名称字典,为每个名称创建一个代理对象并将该代理对象添加到 NSMutableArray:
for (id object in dictArray) {
NSString *agentName = [object objectForKey:@"name"];
[self.myAgents addObject:[Agent agentWithName:agentName]];
}
问题在于,一旦执行通过[self.myAgents addObject:[Agent agentWithName:agentName]];,NSMutableArray self.myAgents 内的所有代理对象都会被调试器列为“超出范围”。当我尝试访问该数组中的对象时,这会导致稍后在我的代码中出现 EXC_BAD_ACCESS。对象被添加到数组中(至少它们出现在 XCode 调试器中)它们只是超出了范围,但在退出 for 循环之前它们就超出了范围。谁能解释我做错了什么?我几乎可以肯定这与我对内存管理缺乏了解有关。谢谢参观。
【问题讨论】:
-
你确定这里的因果关系吗? gdb 有时非常愚蠢,并说某些东西超出了范围,而实际上并非如此。但我怀疑调试器输出是“当我尝试访问该数组中的对象时,这会导致我的代码稍后出现 EXC_BAD_ACCESS”的原因。
-
同意奥莱。您当前发布的代码似乎没有任何问题。我们可以看到您的“myAgents”变量的声明和任何分配吗?我怀疑这就是访问不畅的原因。
-
我同意上面的 cmets,但我要补充一点,通常很难找到 EXC-BAD-ACCESS 的实际来源。它确实表明 something 被过度发布,但很难确定它到底是什么。这就是为什么查看声明和赋值代码会很有帮助。这篇文章有更多的讨论和一些好的答案:stackoverflow.com/q/7691096/962009。
-
“超出范围”与此完全无关。对象不能超出范围,因为对象没有范围。变量有作用域,但变量不控制对象的生命周期。所以你找错地方了。 “超出范围”错误只是调试器中的一个缺陷。
标签: objective-c memory-management scope nsmutablearray