-2

我在使用 NSMutableArray 擦除其内容时遇到问题。

考虑我的代码:(int i; 和 NSMutableArray* newFileControllerArray 一样在我的文件的 .h 中)

-(void)awakeFromNib{
    i = 0;
    newFileWindowControllerArray = [[NSMutableArray alloc]init];
}

-(IBAction)newFileMenubar:(id)sender{    
    [newFileWindowControllerArray addObject:[[NewFileWindowController alloc]initWithWindowNibName:@"NewFileWindowController"]];
    NSUInteger elementsInArray = [newFileWindowControllerArray count];
    NSLog(@"%lu",(unsigned long)elementsInArray);
    [[newFileWindowControllerArray objectAtIndex:i] showWindow:nil];
}

-(IBAction)OKButtonClicked:(id)sender{
    NSUInteger elementsInArray = [newFileWindowControllerArray count];
    NSLog(@"THERE ARE %lu ELEMENTS IN THE ARRAY",(unsigned long)elementsInArray);
}

第一个调用的方法(除了awakeFromNib:)是newFileMenubar:这将向数组添加一个元素。我可以确认这是有效的,因为 1 打印在控制台中。但是,一旦OKbutton被调用,我打印出数组中的元素数,它表示数组中没有元素。这是为什么?

我在这里遗漏了一些非常明显的东西吗?为什么我的阵列会自行重置?

编辑: 评论变得冗长而笨拙,所以这里是带有 NSLogs 和输出的代码:

-(void)awakeFromNib{
    i = 0;
   newFileWindowControllerArray = [NSMutableArray array];


      NSLog(@"self=%p, array=%p", self, newFileWindowControllerArray);
   }

 -(IBAction)newFileMenubar:(id)sender{

     [newFileWindowControllerArray addObject:[[NewFileWindowController           alloc]initWithWindowNibName:@"NewFileWindowController"]];


[[newFileWindowControllerArray objectAtIndex:i] showWindow:nil];


i++;

    NSLog(@"self=%p, array=%p", self, newFileWindowControllerArray);

 }

-(IBAction)OKButtonClicked:(id)sender{
NSUInteger elementsInArray = [newFileWindowControllerArray count];


NSLog(@"self=%p, array=%p", self, newFileWindowControllerArray);


[documentController newDocument:sender];
[[newFileWindowControllerArray objectAtIndex:i]close];


 }

当程序启动时,输出如下: self=0x100141480, array=0x100140f30 这应该来自 awakeFromNib:

下一个调用的方法是 newFileMenubar:

这个的输出是

self=0x1001ac990, array=0x1005228a0 和 self=0x100141480, array=0x100140f30 之后

最后调用的方法是 OKButtonClicked:

最后一个方法(OKButtonClicked:)的输出是 self=0x1001ac990, array=0x1005228a0

正如您从代码中看到的那样,数组的名称没有改变,但我的输出却不一样?什么可能导致这种情况?

4

1 回答 1

1

您的日志输出中有很好的线索。视图控制器有多个实例(查看 'self' 的不同值?)。他们每个人都有自己的数组。看到这段代码...

-(IBAction)newFileMenubar:(id)sender{    
    [newFileWindowControllerArray addObject:[[NewFileWindowController alloc]initWithWindowNibName:@"NewFileWindowController"]];

当您按下与该操作关联的按钮时,您的应用程序会构建另一个视图控制器并将其放置在数组中。该视图控制器从 nib 消息中获取唤醒并分配另一个数组,依此类推。

要确认这一点,请按如下方式更改代码:

-(IBAction)newFileMenubar:(id)sender{    
    [newFileWindowControllerArray addObject:@"Hello world"];

    // and comment this out, for now:
    // [[newFileWindowControllerArray objectAtIndex:i] showWindow:nil]; 

在其他方法中,注释掉您对数组中除了字符串以外的任何内容的期望,然后看看您得到了什么。例如...

- (IBAction)OKButtonClicked:(id)sender {

    NSUInteger elementsInArray = [newFileWindowControllerArray count];
    NSLog(@"self=%p, array=%p", self, newFileWindowControllerArray);
    [documentController newDocument:sender];

    // and comment this out, for now:
    // [[newFileWindowControllerArray objectAtIndex:i]close];

    // instead...
    NSLog(@"danh thinks my array will be ok: %@", newFileWindowControllerArray);
}

您可能并不是要在每次按下按钮时创建另一个视图控制器,但我不确定您想要什么功能。也许您想要一系列视图?(要在另一个控制下创建许多视图控制器,您需要在此处阅读容器视图控制器)。

于 2013-09-09T22:37:04.587 回答