Что не так с этим массивом? Всякий раз, когда я запускаю действие, оно блокируется - PullRequest
0 голосов
/ 30 июля 2009

Почему этот код не работает? Приложение загружается нормально, однако всякий раз, когда я нажимаю кнопку, приложение блокируется (не падает) и возвращает меня в Xcode, а красная стрелка указывает на одну из строк (обозначена в строке ниже).

Я также получаю три предупреждения (не ошибки), одно говорит, что «NSMutableArray» может не отвечать на «-objectAt:», а второе - неиспользуемая переменная «soundToPlay». Третье говорит о неявном объявлении функции «AudioServicesPlaySystemSound». беспокоиться о тех?

    //In MainViewController.h

    @interface MainViewController : UIViewController {
        IBOutlet UIButton *Button;      
    }

    @property (nonatomic, retain) UIButton *Button;

    - (IBAction)playSound;

    NSInteger currentSound;
    NSMutableArray *soundArray;

    @end




    //In MainViewController.m

        - (void)viewDidLoad {
        currentSound = 0;
        NSMutableArray *sounds = [[NSMutableArray alloc] init];
        [sounds addObject: @"0.wav"];
        [sounds addObject: @"1.wav"];
        [sounds addObject: @"2.wav"];
        [sounds addObject: @"3.wav"];
        [sounds addObject: @"4.wav"];
        [sounds addObject: @"5.wav"];
        [sounds addObject: @"6.wav"];
        [sounds addObject: @"7.wav"];
        [sounds addObject: @"8.wav"];
        [sounds addObject: @"9.wav"];
        [sounds addObject: @"10.wav"];
        [sounds addObject: @"11.wav"];
        [sounds addObject: @"12.wav"];
        [sounds addObject: @"13.wav"];
        [super viewDidLoad];
    }

    - (IBAction)playSound {
        NSString *soundToPlay = [soundArray objectAt: currentSound];
//First two errors here.
        currentSound = (currentSound + 1) % [soundArray count]; //Red arrow points to this line.
        AudioServicesPlaySystemSound (currentSound);
//Third error here.
    }

Ответы [ 2 ]

2 голосов
/ 30 июля 2009

Первый: Имя метода не существует. Вы имели в виду не писать objectAtIndex вместо objectAt. Когда он говорит, что объект теперь может отвечать на '-something', это потому, что методы не объявлены в заголовочном файле. Это приводит к тому, что компилятор не уверен, существует ли метод в файле реализации или нет. Когда вы используете встроенные классы (NSArray, NSView и т. Д.), Такие предупреждения обычно означают, что вы неправильно написали имя метода. Единственное, что нужно сделать, это поискать в документации и дважды проверить. Подобные ошибки типов приводят к сбою приложения при попытке отправить сообщение объекту, который не отвечает селектору.

Второй: Это всего лишь предупреждение о том, что переменная не используется. Удалить строку. Как вы можете видеть, soundToPlay не используется в методе playSound, он только объявляется. Если вы используете его FX. при вызове функции NSLog или в методе это предупреждение должно исчезнуть.

Третий: Возможно, вы неправильно используете функцию. Не могу сказать по коду, который ты написал ..

Другое: Даниэль прав. Ваш метод viewDidLoad создает локальный массив и никогда не сохраняет его в переменной soundArray. Для этого добавьте

soundArray = sounds

в нижней части метода. Или просто пишите прямо в soundsArray вместо звуков.

1 голос
/ 30 июля 2009

Из увиденного кода не похоже, что вы когда-либо инициализируете soundArray, вы заполняете локальную переменную в viewDidLoad, называемой звуками, и никогда не устанавливаете soundArray ...

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