2011-10-09 5 views
1

저는 Objective C를 처음 접했고 실제로 도움을 얻을 수있었습니다.객체가 배열에 추가되었습니다. 즉시 범위를 벗어났습니다.

나는 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 루프를 종료하기 전에 범위를 벗어납니다. 아무도 내가 뭘 잘못 설명 할 수 있을까요? 나는 그것이 메모리 관리에 대한 나의 부족함과 관련이 있다는 것을 거의 확신한다. 봐 주셔서 감사합니다.

// 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; 
} 

을 그리고 같은 인스턴스 생성 :

+4

당신에게 여기에 원인과 결과에 대한 특정인가를? gdb는 때로는 꽤 벙어리이며 실제로는 그렇지 않을 때 무언가가 범위를 벗어난다고합니다. 하지만 디버거 출력이 "해당 배열의 개체에 액세스하려고하면 내 코드에서 나중에 EXC_BAD_ACCESS가 발생합니다"라는 이유가 의심 스럽습니다. –

+1

올레와 동의하십시오. 현재 게시 한 코드에 문제가있는 것 같지 않습니다. 선언문과 'myAgents'변수의 할당을 볼 수 있습니까? 그게 나쁜 접근을하는 것 같아. – bobDevil

+0

"범위를 벗어났습니다"는 절대적으로 관련이 없습니다. 오브젝트에는 범위가 없기 때문에 오브젝트가 범위를 벗어날 수 없습니다. 변수에는 범위가 있지만 변수는 객체 수명을 제어하지 않습니다. 그래서 당신은 틀린 장소를보고 있습니다. "범위를 벗어남"오류는 디버거의 결함 일뿐입니다. – Chuck

답변

0

나는 에이전트에 대한 간단한 NSObject의 클래스를 만든 것

// 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]; 
} 
관련 문제