Objective-C - Неизменное объявление внутри if - Scope и Memory Management? - PullRequest
1 голос
/ 07 декабря 2010

В документации Apple указано, что объекты NSDate являются неизменяемыми, что, как я полагаю, означает, что, как только они инициализируются значением, их нельзя / нельзя изменять.

Однако в следующем коде мне нужно, чтобы NSDate было одним из двух возможных значений, поэтому, естественно, я мог бы использовать:

for (class* object in array) {

        if (i == 0) {
            NSDate* fromDate = //...a date
        } else {
            NSDate* fromDate = //...a different date
        }

        //Use fromDate
        i++ 

    }

Насколько я знаю, это недопустимо, потому что использование fromDate вне блока if находится вне области видимости.

Решение обычно будет:

    for (class* object in array) {

        NSDate* fromDate = [[NSDate alloc] init];

        if (i == 0) {
            fromDate = //...a date
        } else {
            fromDate = //...a different date
        }

        //Use then release fromDate
        i++ 

    }

Однако, согласно Apple Docs, когда NSDate получает 'init', он инициализируется с текущей датой, и, поскольку он неизменный, я не могу переназначить его.

Что здесь делать правильно? Просто скопировать весь мой код в блоки if дважды? Или я неправильно понял термин неизменный? Или, может быть, мне нужно сохранить после назначения в первом примере?

спасибо

Ответы [ 2 ]

3 голосов
/ 07 декабря 2010
    NSDate* fromDate = nil

    if (i == 0) {
        fromDate = //create here
    } else {
        fromDate = //or here
    }

При объявлении переменной вам не нужно ничего назначать.

3 голосов
/ 07 декабря 2010
NSDate * fromDate = nil;
if (i == 0) {
  fromDate = //...a date
} else {
  fromDate = //...a different date
}

Ваш вопрос также показывает фундаментальное недопонимание того, как работают указатели.Да, в документации сказано, что NSDate объекты являются неизменяемыми.Но fromDate это не NSDate.Это NSDate*.Другими словами, это просто адрес пересылки, который указывает на то, где живет фактический NSDate объект.Сам указатель является изменяемым (если он не объявлен как const), и вы можете свободно изменять значение pointer столько раз, сколько захотите.Однако вещь, на которую указывает указатель (фактический NSDate), является неизменной.

...