Objective c ApplicationIDFinishLaunching变量范围问题?

Objective c ApplicationIDFinishLaunching变量范围问题?,objective-c,xcode,cocoa,nsarray,Objective C,Xcode,Cocoa,Nsarray,只是一个简单的问题。我有一个NSArray,它是在ApplicationIDFinishLaunching方法中生成的,但由于某些原因,该数组没有被其他方法使用,并且表示它未被使用 -(void)applicationDidFinishLaunching... { NSArray* songsArray = [root nodesForXPath:@".//dict/dict/dict" error:nil]; -(id)tableView:(NSTableView *)tableVi

只是一个简单的问题。我有一个NSArray,它是在ApplicationIDFinishLaunching方法中生成的,但由于某些原因,该数组没有被其他方法使用,并且表示它未被使用

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

-(id)tableView:(NSTableView *)tableView objectValueForTableColumn... {
    for(NSXMLElement* song in songsArray) {
我也在头文件中声明了变量

干杯,
Scott

您已将
songsArray
声明为局部变量,它在
ApplicationIDFinishLaunching
外部不可见

如果您已经在标头中声明了变量,则只需分配它:

-(void)applicationDidFinishLaunching... {
    songsArray = [root nodesForXPath:@".//dict/dict/dict" error:nil];
关于内存管理的注意事项: 如果您不使用ARC,您还需要
保留
您的阵列,否则它将在
ApplicationIDFinishLaunching
结束时自动删除,并且您的变量将指向释放的内存,您的应用程序将崩溃


不要忘记在
dealloc
中释放它(同样,如果您不在ARC land中)。

您可能在标题中声明了一首
songsArray
,但您没有在
中分配它-应用程序:didfishLaunching:
。相反,您创建了一个具有相同名称的局部变量,该变量只会保留在作用域中,直到方法结束。按如下方式分配ivar:

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

您正在方法范围内创建
songsArray
,需要将其作为类变量添加,如下所示:

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
耗尽时阵列不会自动释放