NSMutable Массив, возвращающий NULL, когда NSLog - PullRequest
0 голосов
/ 03 сентября 2011

Итак, у меня есть массив NSMutable, который я заполняю в viewDidLoad, а затем NSLog, и он возвращает NULL в консоли ... Я посмотрел на переполнение стека и ссылку на apple и не могу найти решение моей проблемы.

Вот код, который я использовал:

//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; 

Спасибо заранее!~ Matt

1 Ответ

3 голосов
/ 03 сентября 2011

код, который вы разместили, не содержит достаточно информации, чтобы мы могли дать конкретный ответ.Скорее всего, методы не вызываются в том порядке, в котором вы их ожидаете (например, populateArray вызывается из другой точки перед viewDidLoad).

Некоторые утверждения должны помочь диагностировать это:

//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 можетбезусловно, будет вызываться несколько раз на одном и том же экземпляре.система выгружает (затем лениво перезагружает) представления в условиях нехватки памяти.

...