2012-01-10 3 views
1

간단한 질문입니다. 내 applicationDidFinishLaunching 메서드에서 생성 된 NSArray 있지만 어떤 이유로 배열 다른 메서드에 의해 사용되고 및 사용되지 않는 것을 말하고있다.applicationDidFinish 변수 범위 문제가 발생 했습니까?

-(void)applicationDidFinishLaunching... { 
    NSArray* songsArray = [root nodesForXPath:@".//dict/dict/dict" error:nil]; 

-(id)tableView:(NSTableView *)tableView objectValueForTableColumn... { 
    for(NSXMLElement* song in songsArray) { 

나는 헤더 파일에도 변수를 선언했습니다. 당신은 지역 변수로 songsArray를 선언 한

답변

0

건배, 스콧, 그것은 외부 applicationDidFinishLaunching 볼 수 없습니다. 이미 헤더에 변수를 선언 한 경우

, 당신은 단지 할당해야합니다

-(void)applicationDidFinishLaunching... { 
    songsArray = [root nodesForXPath:@".//dict/dict/dict" error:nil]; 

참고 메모리 관리에 : 는 ARC를 사용하지 않는 경우, 당신은 또한 당신의 배열을 retain 필요 그렇지 않으면 applicationDidFinishLaunching의 끝에 자동 리트 리 (autoreleased)되고 변수가 할당 해제 된 메모리를 가리키고 앱이 다운됩니다.

release을 잊지 말고 dealloc (다시 ARC 지역에 있지 않은 경우).

2

머리글에 songsArray을 (를) 선언 할 수는 있지만 -application:didFinishLaunching:에는 지정하지 않았을 수 있습니다. 대신 메소드의 끝까지 스코프에 머물러있는 동일한 이름의 로컬 변수를 만들었습니다. 이처럼 바르 할당 : 다음과 같이 방법의 범위에 songsArray를 작성하는

songsArray = [root nodesForXPath:@".//dict/dict/dict" error:nil]; 
1

을, 당신은 클래스 변수로 이것을 추가해야

MyApplication.h을

@interface MyApplication { 
    NSArray *songsArray; 
} 

MyApplication.m

- (void)applicationDidFinishLaunching… { 
    songsArray = [[root nodesForXPath:@".//dict/dict/dict" error:nil] retain]; 
} 

- (void)dealloc { 
    [songsArray release]; 
    songsArray = nil; 
} 

NSAutoReleasePool이 고갈되면 어레이가 자동으로 방출되지 않도록 retain도 필요합니다.

관련 문제