NSMutableArray重置自己?

时间:2013-09-08 21:14:27

标签: objective-c macos cocoa nsmutablearray nsarray

我遇到NSMutableArray擦除其内容的问题。

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

-(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并且我打印出数组中元素的数量,它就会说数组中没有元素。那是为什么?

我错过了一些非常明显的东西吗?为什么我的阵列会重置?

修改 这些评论变得冗长而笨拙,所以这里是代码w / 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

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

1 个答案:

答案 0 :(得分: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);
}

你可能并不是要在按下每个按钮时创建另一个视图控制器,但我不确定你想要什么功能。也许你想要一系列的观点? (要在另一个控制下创建许多视图控制器,您需要阅读container view controllers, here)。