当NSLog时,NSMutable Array返回NULL

时间:2011-09-03 19:01:48

标签: objective-c xcode null nsmutablearray

所以我有一个NSMutable数组,我在viewDidLoad中填充,然后我NSLog它,它在控制台中返回NULL ...我已经查看了堆栈溢出和苹果引用,无法找到我的问题的解决方案。

继承我使用的代码:

//Populate array
-(void)populateArray{
[TextArray addObject:@"Text1"]; 
[TextArray addObject:@"Text2"]; 
[TextArray addObject:@"Text3"]; 
[TextArray addObject:@"Text4"]; 
[TextArray addObject:@"Text5"]; 
NSLog(@"%@",TextArray);
NSLog(@"%@",[TextArray objectAtIndex:1]);
}

-(void)viewDidLoad
{
TextArray = [[NSMutableArray alloc] init];
[self populateArray];
}

在.h文件中

NSMutableArray *TextArray; 

先谢谢了! 马特〜

1 个答案:

答案 0 :(得分:3)

您发布的代码中没有足够的信息供我们提供具体答案。可能的情况是,方法没有按照您期望的顺序调用(例如,在viewDidLoad之前从另一个点调用populateArray)。

一些断言应该有助于诊断:

//Populate array
-(void)populateArray
{
    assert(nil != self.textArray && "you need to create an array");

    [self.textArray addObject:@"Text1"];
    [self.textArray addObject:@"Text2"];
    [self.textArray addObject:@"Text3"];
    [self.textArray addObject:@"Text4"];
    [self.textArray addObject:@"Text5"];

    assert(5 == [self.textArray count] && "populateArray has been called twice or serious threading error");

    NSLog(@"%@",textArray);
    NSLog(@"%@",[textArray objectAtIndex:1]);
}

-(void)viewDidLoad
{
    assert(nil == self.textArray && "you need to clear your array (e.g. in viewDidUnload) or check if it has already been populated");

    self.textArray = [NSMutableArray array];
    [self populateArray];

    assert(5 == [self.textArray count] && "populateArray has been called twice or serious threading error");
}

最后,如果这个数组永远不会改变,那么在初始化器中创建它会比在懒惰中更简单。如果你担心的话,这样的数组不需要太多内存。

更新构造采用以下形式:

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle
{
    self = [super initWithNibName:nibName bundle:nibBundle];
    if (nil != self){
        textArray = [[NSArray alloc] initWithObjects:@"Text1", @"Text2", @"Text3", @"Text4", @"Text5", nil];
// ...
    }
    return self;
}

最后,viewDidLoad当然可以在同一个实例上多次调用。系统在低内存条件下卸载(然后懒洋洋地重新加载)视图。