Что означает "& ошибка" в Objective-C?

Возможный дубликат:
почему здесь используется "ошибка: и ошибка" (цель-с)

AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device
                                                                    error:&error];

Что это & символ означает в приведенном выше коде?

3 ответа

Решение

Это адрес оператора; это производит указатель, указывающий на референт. В этом случае, error является NSError *; AVCaptureDeviceInput deviceInputWithDevice:error: принимает адрес и может изменить error через этот указатель, чтобы указать на ошибку, которая произошла.

Ошибка - указатель на объект ошибки. &error - указатель на указатель на объект ошибки. Если вы передаете методу указатель на указатель на ошибку, а затем возникает ошибка, метод может выделить объект ошибки и установить указатель ошибки, чтобы он указывал на него.

Символ & используется для передачи адреса переменной с префиксом. Он также называется передачей по ссылке, а не передачей по значению. Итак, &error означает адрес ошибки. Поскольку error определяется как указатель, то &error является адресом указателя на фактическое хранилище ошибок.

Метод, который вы вызываете, может иметь параметр, определенный как **error, что заставляет вас передавать указатель на указатель или ссылку на указатель.

Если метод использует * error в качестве параметра, метод может изменить значение, на которое указывает параметр. На это значение может ссылаться вызывающая сторона, когда метод возвращает управление. Однако, когда метод использует ** error в качестве параметра, метод также может изменить сам указатель, заставив его указать другое местоположение. Это означает, что переменная ошибки вызывающей стороны, следовательно, будет содержать новый указатель.

Вот пример

    -(void)changePointerOfString:(NSString **)strVal {
        *strVal = @"New Value";
    }

    -(void)caller {
        NSString *myStr = @"Old Value";      // myStr has value 'Old Value'
        [self changePointerOfString:&myStr]; // myStr has value 'New Value'
    }
Другие вопросы по тегам