Проблемы с нулевым выводом - PullRequest
0 голосов
/ 17 июля 2011

Хорошо, я пытаюсь сделать это в течение 2-3 часов, и я не совсем понимаю. Вот код и краткое объяснение: Я пытаюсь составить два списка слов, вытащить одно слово из каждого из этих списков случайным образом и отобразить оба слова (вместе с третьим) на экране при нажатии кнопки. Вот код:

   #import "Project001ViewController.h"

    @implementation Project001ViewController

    -(ArrayOfWords *) advs
    {
        if(!advs){
            advs = [[ArrayOfWords alloc] init];
            NSString* advpath = @"/WordLists/adverbs.txt";
            NSLog(@"1");
            [[self advs] populateListOfWords:advpath];
        }
        return advs;
    }


    -(ArrayOfWords *) adjs
    {
        if (!adjs) {
            adjs = [[ArrayOfWords alloc] init];
            NSString* adjpath = @"/WordLists/adjectives.txt";
            [[self adjs] populateListOfWords:adjpath];
            NSLog(@"2");
        }
        return adjs;
    }


    - (IBAction)generate:(UIButton *)sender;
    {
        //int randy = arc4random() % 11;
        //NSNumber* num= [NSNumber numberWithInteger:randy];


        NSString* obj = @"app";
        NSString* adverb = [[self advs] randomItem];
        NSString* adjective = [[self adjs] randomItem];
        NSLog(@"%i   %i",[adjs size],[advs size]);



        NSLog(@"1 %@ %@ %@.",adverb, adjective, obj);
        //NSLog(@"%@",thePhrase);
        [display setText:@"Hi"];
    }


    @end

У меня проблемы с последней NSLog строкой:

 NSString* obj = @"app";
        NSString* adverb = [[self advs] randomItem];
        NSString* adjective = [[self adjs] randomItem];
        NSLog(@"%i   %i",[adjs size],[advs size]);
        NSLog(@"1 %@ %@ %@.",adverb, adjective, obj);

Вместо получения двух случайно выбранных слов (используя arc4random() для их получения) массив возвращает Null. Но я знаю ДЛЯ НЕОБХОДИМОСТИ. Массивы не пусты, потому что в строке NSLog, где я печатаю [adjs size] и [advs size], я получаю правильные размеры списка слов. Я просто хочу знать, что заставляет их печатать здесь Null.

методы populateListOfWords, randomItem и size:

- (NSArray *) populateListOfWords:(NSString *) path {

    //gets the components of the file into an NSString
    NSString *wordListString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    //returns an array of all the words (uses the next line indicator '\n' to know when it's at the end of the word
    NSArray* words = [wordListString componentsSeparatedByString:@"\n"];

    length=(NSNumber*)([words count]);
    return words;

  }


-(NSString*) randomItem{
    //returns random object in list
    return (NSString*)[list objectAtIndex:(arc4random() % (int)length)] ;

}

-(int) size{
    //returns size of list
    return (int)length;
}

(Если требуется больше кода, дайте мне знать и заранее благодарим вас за любую помощь).

Ответы [ 2 ]

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

Этот метод является проблемой:

- (NSArray *) populateListOfWords:(NSString *) path {

    //gets the components of the file into an NSString
    NSString *wordListString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    //returns an array of all the words (uses the next line indicator '\n' to know when it's at the end of the word
    NSArray* words = [wordListString componentsSeparatedByString:@"\n"];

    length=(NSNumber*)([words count]);
    return words;

  }

На самом деле слова не были включены в список, к которому кто-либо мог получить доступ. Я должен был просто изменить это так:

- (void) populateListOfWords:(NSString *) path {

    //gets the components of the file into an NSString
    NSString *wordListString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    //returns an array of all the words (uses the next line indicator '\n' to know when it's at the end of the word
    NSArray* words = [wordListString componentsSeparatedByString:@"\n"];

    list = words;
    length=(int)([words count]);
  }

Теперь это дает мне правильный вывод. Но по какой-то причине, когда я нажимаю кнопку дважды, она вылетает. Ну что ж, это новая проблема. Еще раз спасибо за помощь.

UPDATE Оказывается, advs и adjs были освобождены, поэтому во время второго обхода он пытался получить доступ к значению nil, потому что когда я вызываю [self advs] [self adjs], указатели существуют, а их содержимое - нет. Мне приходилось возвращаться и пополнять их каждый раз, в основном удаляя части if (!advs) и if (adjs). Теперь он работает как задумано.

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

Я считаю, что есть проблема с путями.Невозможно получить доступ к пути /WordLists/adjectives.txt в iOS из-за изолированной программной среды приложения.Я предлагаю вам добавить эти файлы в приложение, перетаскивая их в проект.Вы можете получить пути к файлам для ресурсов в комплекте приложений, используя

NSString * path = [[NSBundle mainBundle] pathForResource:@"adjectives" ofType:@"txt"];

Теперь передайте это path методу populateListOfWords:.

Из-за неправильного пути, я считаю wordListString is nil, и все остальное следует за этим.

Другое дело, что int и NSNumber не являются платными мостами, как NSString s и другие объекты фундамента.Так что

length=(NSNumber*)([words count]);

неверно.Я предлагаю вам определить length как int или лучше NSUInteger, чтобы соответствовать типу count, который возвращает метод.

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