Объект, добавленный в массив, сразу выходит из области видимости - PullRequest
1 голос
/ 09 октября 2011

Я новичок в 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 голосов
/ 21 ноября 2012

Я бы создал простой класс 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];
}
...