我遇到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
正如您从代码中看到的那样,数组的名称不会改变,但我的输出会有所不同吗?什么可能导致这种情况?
答案 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)。