Noob озадачен поведением массива NSMutable - PullRequest
3 голосов
/ 27 июля 2011

Я новичок, пытаюсь разобраться, используя 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» и «цена» содержат именно то, что я ожидаю (= именно те значения, которые я дал им в «awakeFromNib»), но затем программа выдает « Программа получила сигнал: сообщение «EXC_BAD_ACCESS», и пляжный мяч появляется, как будто я ему не нравлюсь, ссылаясь на мой массив «возрастов».

Очевидно, что здесь есть нечто фундаментальное, чего я не понимаю. Я могу сослаться на мой int и мою NSString, но не на мой NSMutableArray?

Я сбит с толку.

Если бы кто-нибудь мог указать мне правильное направление, я был бы очень благодарен.

Спасибо, что прочитали это.

Ответы [ 3 ]

9 голосов
/ 27 июля 2011

Вы инициализируете свой массив с arrayWithObjects.Обратите внимание, что эти методы возвращают автоматически выпущенный объект, который, вероятно, недействителен после окончания awakeFromNib.

Либо добавьте сообщение retain:

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

, либо используйтеметод, который не возвращает объект с автоматическим выпуском , такой как alloc и init по умолчанию:

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

И обязательно прочитайте Управление памятьюРуководство .

1 голос
/ 27 июля 2011

Мне кажется, ты не сохранил ages.Так что в презентации UI код «появляется», когда код «выходит в эфир».

Вам необходимо изучить управление хранением данных в Objective-C.

0 голосов
/ 27 июля 2011

Вам нужно сохранить свой массив при его создании, иначе он будет уничтожен в конце текущего цикла событий. Вы также можете использовать создание стиля [[alloc] init], которое не обязательно требует сохранения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...