我是一个菜鸟,正试着用XCode为一个非常简单的Mac应用程序组装一个非常简单的界面。
我尽可能地删除了我的应用程序,以说明我遇到的障碍。
我当前的界面只包含一个按钮。
在我的AppController.h文件中,我有以下内容:
@interface AppController : NSObject
{
NSMutableArray *ages;
int price;
NSString *culler;
}
-(IBAction) handleButtonClick: (NSButton*)sender;
@end
在我的AppController.m文件中,我使用awakeFromNib方法设置初始值:
-(void)awakeFromNib
{
ages = [NSMutableArray arrayWithObjects: nil];
[ages addObject: [NSNumber numberWithInt: 10]];
[ages addObject: [NSNumber numberWithInt: 21]];
price = 45;
culler = [NSString stringWithString: @"bright green"];
NSLog(@"waking up from nib, ages contains %i objects",[ages count]);
NSLog(@"they are ...");
for(int i = 0; i<[ages count]; i++)
{
NSLog(@"%i", [[ages objectAtIndex: i] integerValue]);
}
NSLog(@"waking up from nib, the current price is %i", price);
NSLog(@"waking up from nib, the color is %@", culler);
}
这一切似乎都运行良好,我得到了我期待的日志消息。
但是在我处理单击按钮的方法中,我有以下内容:
-(void) handleButtonClick: (NSButton*) sender
{
NSLog(@"you clicked the button");
NSLog(@"after clicking the button, the current price is %i", price);
NSLog(@"after clicking the button, the color is %@", culler);
NSLog(@"after clicking the button, ages contains %i objects",[ages count]);
NSLog(@"they are ...");
for(int i = 0; i<[ages count]; i++)
{
NSLog(@"%i", [[ages objectAtIndex: i] integerValue]);
}
}
当我点击按钮时,我收到日志消息告诉我'culler'和'price'正好包含我所期望的(=我在'awakeFromNib'中给出的值),但程序然后吐出一个“程序收到信号:“EXC_BAD_ACCESS”“消息和沙滩球出现,好像它不喜欢我指的是'年龄'阵列。
显然我在这里不理解一些基本的东西。 我可以引用我的int和我的NSString,但不能引用我的NSMutableArray?
我很困惑。
如果有人能指出我正确的方向,我将非常感激。
感谢您阅读本文。
答案 0 :(得分:9)
您正在使用arrayWithObjects
初始化数组。请注意,此方法会返回自动释放的对象,该对象在awakeFromNib
结束后可能无效。
添加retain
消息:
ages = [[NSMutableArray arrayWithObjects:nil] retain];
或者使用不会返回自动释放的对象的方法,例如默认的alloc
和init
方式:
ages = [[NSMutableArray alloc] initWithObjects:nil];
请务必阅读Memory Management Guide。
答案 1 :(得分:1)
在我看来,你没有保留ages
。因此,当UI演示中的代码“浮出水面”时,它会变得“噗”。
您需要在Objective-C中研究存储管理。
答案 2 :(得分:0)
您需要在创建数组时保留数组,否则它将在当前事件循环结束时被销毁。您也可以使用[[alloc] init]样式创建,它不一定需要保留。