applicationDidFinishLaunching变量范围问题?

时间:2012-01-10 18:44:38

标签: objective-c xcode cocoa nsarray

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

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

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

我已经在头文件中声明了变量。

干杯, 斯科特

3 个答案:

答案 0 :(得分:2)

您可能在标头中声明了songsArray,但未在-application:didFinishLaunching:中进行分配。相反,您已经创建了一个具有相同名称的局部变量,该变量仅在方法结束之前保留在范围内。像这样分配你的ivar:

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

答案 1 :(得分:1)

您正在方法的范围内创建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;
}

注意,您还需要retain,以便在排空NSAutoReleasePool时不会自动释放数组。

答案 2 :(得分:0)

您已将songsArray声明为本地变量,但在applicationDidFinishLaunching之外无法显示。

如果您已在标题中声明了变量,则只需指定它:

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

关于内存管理的注意事项: 如果你没有使用ARC,你还需要retain你的数组,否则它将在applicationDidFinishLaunching结束时自动释放,你的变量将指向一个释放的内存,你的应用程序将崩溃

不要忘记在release dealloc {再次,如果你不在ARC的土地上)。