Почему NSError должен удвоить косвенность? (указатель на указатель)

var list = [1, 2, 3, 4, 5];

for (var i = 0, len = list.length; i < len; i += 1) {
    (function(i) {
        setInterval(function() {
            list[i] += 10;
            console.log(i + "=>" + list[i] + "\n");
        }, 5000)
    })(i);
}

Вот рабочий код:

var list = [1, 2, 3, 4, 5];

for (var i = 0, len = list.length; i < len; i += 1) {
    (function(i) {
        setInterval(function() {
            list[i] += 10;
            console.log(i + "=>" + list[i] + "\n");
        }, 5000)
    })(i);
}

Здесь индекс i хранится в анонимном функция, чтобы она не перезаписывалась последовательными циклами. Функция setInterval в вашем коде сохраняет ссылку только на последнее значение i.

46
задан Coocoo4Cocoa 24 May 2009 в 04:53
поделиться

3 ответа

Шаблон NSError ** используется, когда метод обычно возвращает некоторое значение, но вместо этого может потребоваться возврат объекта ошибки (типа NSError * ) в случае неудачи. В Objective-C метод может возвращать только один тип объекта, но это тот случай, когда вы хотите вернуть два. В языках типа C, когда вам нужно вернуть дополнительное значение, вы запрашиваете указатель на значение этого типа, поэтому для возврата NSError * вам нужен параметр NSError ** . Более реалистичный пример:

// The method should return something, because otherwise it could just return
// NSError* directly and the error argument wouldn't be necessary
- (NSArray *)doStuffWithObject:(id)obj error:(NSError **)error
{
  NSArray *result = ...;  // Do some work that might fail
  if (result != nil) {
    return result;
  } else {
    // Something went bad!
    // The caller might pass NULL for `error` if they don't care about
    // the result, so check for NULL before dereferencing it
    if (error != NULL) {
      *error = [NSError errorWithDomain:...];
    }
    return nil;  // The caller knows to check error if I return nil
  }
}

Если бы у вас был только параметр NSError * вместо NSError ** , тогда doStuff никогда бы не смог передать объект ошибки обратно вызывающей стороне.

78
ответ дан 26 November 2019 в 19:59
поделиться

Все очень просто:

если вы передаете указатель на объект вашей функции, функция может изменять только то, на что указывает указатель.

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

В случае NSError функция может захотеть создать новый объект NSError и передать вам обратно указатель на этот объект NSError. Таким образом, вам нужно двойное косвенное обращение, чтобы можно было изменить указатель.

95
ответ дан 26 November 2019 в 19:59
поделиться

Альтернативное утверждение того, что сказал n8gray:

Поскольку вы не получаете объект для отправки сообщений; вы создаете объект и возвращаете его. Обычно вам нужен аргумент указатель на переменную NSError * , потому что вы можете использовать оператор return только для одного элемента за раз, и вы уже используете его с НЕТ .

7
ответ дан 26 November 2019 в 19:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: