空输出麻烦

时间:2011-07-17 06:33:17

标签: cocoa-touch null

好的,我现在已经尝试了大约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。但我知道FOR CERTAIN。数组不是空的,因为我打印NSLog[adjs size]的{​​{1}}行我得到了正确的单词列表大小。我只是想知道是什么原因导致他们在这里打印[advs size]

populateListOfWords,randomItem和size方法:

Null

(如果需要更多代码,请告知我,并感谢您提前获取任何帮助)。

2 个答案:

答案 0 :(得分:0)

我认为路径存在问题。由于应用程序沙箱,无法访问iOS中的路径/WordLists/adjectives.txt。我建议您通过将这些文件拖放到项目中来将这些文件添加到应用程序中。您可以使用

获取应用程序包中资源的文件路径
NSString * path = [[NSBundle mainBundle] pathForResource:@"adjectives" ofType:@"txt"];

现在将此path传递给方法populateListOfWords:

由于道路不正确,我相信wordListStringnil,其他一切都是如此。

另一件事是intNSNumber不像NSString和其他基础对象那样免费桥接。所以

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

不正确。我建议您将length定义为int或更好NSUInteger以匹配类型count方法返回。

答案 1 :(得分:0)

这个方法就是问题:

- (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]);
  }

现在它给了我正确的输出。但出于某种原因,当我按下按钮两次时,它会崩溃。哦,这是一个新问题。再次感谢所有的帮助。

<强>更新 事实证明advsadjs正在被释放,所以第二次尝试访问它是因为当我调用[self advs] [self adjs]时指针存在,但它们的内容不存在。每次基本上删除if (!advs)if (adjs)部分时,我都必须返回并重新填充它们。它现在按预期工作。