添加到Array的对象立即“超出范围”

时间:2011-10-09 16:26:30

标签: objective-c memory-management scope nsmutablearray

我是Objective C的新手,我真的可以使用一些帮助。

我创建了一个名为Agent的类。 Agent类包含以下方法:

    + (Agent *)agentWithName:(NSString*)theName {

        Agent *agent = [[[Agent alloc] init] autorelease];

        agent.agentName = theName;
        return agent;
    }

然后从我的根视图控制器中我想循环遍历名称字典,为每个名称创建一个Agent对象,并将该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循环之前就超出了范围。任何人都可以解释我做错了什么?我几乎可以肯定这与我对内存管理缺乏了解有关。谢谢参观。

1 个答案:

答案 0 :(得分:0)

我会为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];
}