В Задаче C объявленные переменные равны нулю? - PullRequest
1 голос
/ 20 марта 2012

У меня есть случай, когда я объявляю NSMutableArray, а затем тестирую его так:

-(void)whatever {
    NsMutableArray *array;

    for(int i = 0; i < 10; i++) {
        if(array){
            [array release];
        }
        array = [[NsMutableArray alloc] init];
        // Add things to the array and do stuff with those things before starting over
    }
    if ([array count] > 0) {
        // Do something else
    }
}

По какой-то причине if(array){} оценивается как ДА и пытается выпустить объект, который еще не существует при первом прохождении. Он также оценивается как ДА, если я пытаюсь if(array != nil){}. Есть ли лучший способ проверить это?

Ответы [ 3 ]

4 голосов
/ 20 марта 2012

Массив переменных объявлен в стеке, потому что он объявлен в такой функции; он содержит все, что было в стеке на тот момент, что во многих случаях может быть не NIL

В этом случае вам нужно обязательно инициализировать переменную, поэтому вы должны использовать:

NSMutableArray *array = nil;

Вы должны выполнить Product -> Analyze для своего кода, который обнаружит множество распространенных ошибок, подобных этой (а также других ошибок).

3 голосов
/ 20 марта 2012

Когда вы объявляете ваш array, установите его равным nil:

NSMutableArray *array = nil;

В противном случае вы можете получить мусор в указателе.

1 голос
/ 20 марта 2012

Я не уверен, что вы пытаетесь достичь с помощью этого кода, так как объявленный массив всегда будет "ноль", когда вы входите в цикл.Я предполагаю, что у вас раньше происходило больше вещей, и в этом случае вы должны сделать это следующим образом:

-(void)whatever {
    NSMutableArray *array = nil;

    for(int i = 0; i < 10; i++) {
        if(array){
            [array release];
            array = nil;
        }
    array = [[NSMutableArray alloc] init];
    // Add things to the array and do stuff with those things before starting over
    }
    if ([array count] > 0) {
        // Do something else
    }   
}

При освобождении объекта (и вы УВЕРЕНЫ, что его счет сохранения достигнет 0 и, следовательно,на самом деле он удаляется), тогда вы должны установить array на ноль, поскольку даже если объект освобожден, переменная array является просто указателем на адрес памяти, на котором находился объект до его удаления, и не будетnil.

Кроме того, при объявлении переменной выполните NSMutableArray *array = nil;, поскольку в противном случае это может быть просто любой нежелательный адрес в стеке, который не будет иметь значение nil в предложении if.

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