【问题标题】:Object added to Array is immediately 'out of scope'添加到 Array 的对象立即“超出范围”
【发布时间】: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


【解决方案1】:

我会为 Agent 创建一个简单的 NSObject 类:

//  Agent.h

@interface Agent : NSObject

@property (nonatomic, copy) NSString *agentName;

- (id)initWithAgentName:(NSString *)name;

@end

// Agent.m

@implementation Agent

- (id)initWithAgentName:(NSString *)name
{
    self = [super init];
    if (self) {
        // Custom initialization

        self.agentName = name;
    }
    return self;
}

然后创建如下实例:

// Assuming dictArray contains NSDictionaries like your code implies
for (id dictionary in dictArray)
{
    NSString *agentName = [dictionary objectForKey:@"name"];
    Agent *agent = [[Agent alloc] initWithAgentName:agentName];
    [self.myAgents addObject:agent];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 2015-01-26
    相关资源
    最近更新 更多