Noob被NSMutable数组行为所迷惑

时间:2011-07-27 18:22:56

标签: objective-c xcode nsmutablearray

我是一个菜鸟,正试着用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?

我很困惑。

如果有人能指出我正确的方向,我将非常感激。

感谢您阅读本文。

3 个答案:

答案 0 :(得分:9)

您正在使用arrayWithObjects初始化数组。请注意,此方法会返回自动释放的对象,该对象在awakeFromNib结束后可能无效。

添加retain消息:

ages = [[NSMutableArray arrayWithObjects:nil] retain];

或者使用不会返回自动释放的对象的方法,例如默认的allocinit方式:

ages = [[NSMutableArray alloc] initWithObjects:nil];

请务必阅读Memory Management Guide

答案 1 :(得分:1)

在我看来,你没有保留ages。因此,当UI演示中的代码“浮出水面”时,它会变得“噗”。

您需要在Objective-C中研究存储管理。

答案 2 :(得分:0)

您需要在创建数组时保留数组,否则它将在当前事件循环结束时被销毁。您也可以使用[[alloc] init]样式创建,它不一定需要保留。