Compartilhar via


AVCaptureSession Classe

Definição

Coordena uma sessão de gravação.

[Foundation.Register("AVCaptureSession", true)]
[ObjCRuntime.Unavailable(ObjCRuntime.PlatformName.WatchOS, ObjCRuntime.PlatformArchitecture.All, null)]
[ObjCRuntime.Unavailable(ObjCRuntime.PlatformName.TvOS, ObjCRuntime.PlatformArchitecture.All, null)]
public class AVCaptureSession : Foundation.NSObject
type AVCaptureSession = class
    inherit NSObject
Herança
AVCaptureSession
Atributos

Comentários

O objeto AVCaptureSession coordena a gravação de entrada de áudio ou vídeo e passa as informações gravadas para um ou mais objetos de saída. Como a linha iOS avançou, diferentes dispositivos ganharam vários dispositivos de captura (em particular, ganharam várias câmeras). Os desenvolvedores de aplicativos podem usar DefaultDeviceWithMediaType(String) ou DevicesWithMediaType(String), passando as constantes definidas em AVMediaType.

A configuração da captura consiste em definir as Inputs propriedades e Outputs do AVCaptureSession. Observe que vários AVCaptureInputs e AVCaptureOutputs são possíveis. Por exemplo, para capturar áudio e vídeo, um usaria duas entradas de captura:

var session = new AVCaptureSession();

var camera = AVCaptureDevice.DefaultDeviceWithMediaType(AVMediaType.Video);
var mic = AVCaptureDevice.DefaultDeviceWithMediaType(AVMediaType.Audio);
if(camera == null || mic == null){
    throw new Exception("Can't find devices");
}

var cameraInput = AVCaptureDeviceInput.FromDevice (camera);
//info.plist _must_ contain NSMicrophoneUsageDescription key
var micInput = AVCaptureDeviceInput.FromDevice (mic);

if(session.CanAddInput(cameraInput)){
    session.AddInput(cameraInput);
}
if(session.CanAddInput(micInput)){
   session.AddInput(micInput);
}

Observe que a permissão para acessar o microfone (e em algumas regiões, a câmera) deve ser fornecida pelo usuário, exigindo que o desenvolvedor adicione o NSMicrophoneUsageDescription ao arquivo info.plist do aplicativo.

O vídeo pode ser capturado diretamente no arquivo com AVCaptureMovieFileOutput. No entanto, essa classe não tem dados capazes de exibição e não pode ser usada simultaneamente com AVCaptureVideoDataOutput. Em vez disso, os desenvolvedores de aplicativos podem usá-lo em combinação com um AVCaptureVideoPreviewLayer, conforme mostrado no exemplo a seguir:

var layer = new AVCaptureVideoPreviewLayer (session);
layer.VideoGravity = AVLayerVideoGravity.ResizeAspectFill;

var cameraView = new UIView ();
cameraView.Layer.AddSublayer (layer);

var filePath = Path.Combine (Path.GetTempPath (), "temporary.mov");
var fileUrl = NSUrl.FromFilename (filePath);

var movieFileOutput = new AVCaptureMovieFileOutput ();
var recordingDelegate = new MyRecordingDelegate ();
session.AddOutput (movieFileOutput);

movieFileOutput.StartRecordingToOutputFile (fileUrl, recordingDelegate);

Os desenvolvedores de aplicativos devem observar que a função StopRecording() é assíncrona; os desenvolvedores devem aguardar até o FinishedRecording(AVCaptureFileOutput, NSUrl, NSObject[], NSError) método delegado antes de manipular o arquivo (por exemplo, antes de salvá-lo no álbum Fotos com SaveToPhotosAlbum(String, UIVideo+SaveStatus) ou WriteVideoToSavedPhotosAlbumAsync(NSUrl)).

public class MyRecordingDelegate : AVCaptureFileOutputRecordingDelegate
{
    public override void FinishedRecording (AVCaptureFileOutput captureOutput, NSUrl outputFileUrl, NSObject [] connections, NSError error)
    {
        if (UIVideo.IsCompatibleWithSavedPhotosAlbum (outputFileUrl.Path))
        {
            var library = new ALAssetsLibrary ();
            library.WriteVideoToSavedPhotosAlbum (outputFileUrl, (path, e2) =>
            {
                if (e2 != null)
                {
                    new UIAlertView ("Error", e2.ToString (), null, "OK", null).Show ();
                }
                else
                {
                    new UIAlertView ("Saved", "Saved to Photos", null, "OK", null).Show ();
                    File.Delete (outputFileUrl.Path);
                }
            });
        }
        else
        {
            new UIAlertView ("Incompatible", "Incompatible", null, "OK", null).Show ();
        }

    }
}          

Os desenvolvedores de aplicativos podem configurar uma ou mais portas de saída para os dados capturados e elas ainda podem ser quadros, quadros de vídeo com informações de tempo, exemplos de áudio, arquivos de filme de tempo rápido ou podem ser renderizados diretamente em uma camada CoreAnimation.

Depois que os componentes de entrada e saída da sessão são definidos, o processamento real é iniciado chamando o StartRunning() método .


void SetupCapture ()
	/ configure the capture session for low resolution, change this if your code
	// can cope with more data or volume
	session = new AVCaptureSession () {
	        SessionPreset = AVCaptureSession.PresetMedium
	};

	// create a device input and attach it to the session
	var captureDevice = AVCaptureDevice.DefaultDeviceWithMediaType (AVMediaType.Video);
	var input = AVCaptureDeviceInput.FromDevice (captureDevice);
	if (input == null){
	        Console.WriteLine ("No video input device");
	        return false;
	}
	session.AddInput (input);

	// create a VideoDataOutput and add it to the sesion
	var output = new AVCaptureVideoDataOutput () {
	        VideoSettings = new AVVideoSettings (CVPixelFormatType.CV32BGRA),

	        // If you want to cap the frame rate at a given speed, in this sample: 15 frames per second
	        MinFrameDuration = new CMTime (1, 15)
	};

	// configure the output
	queue = new MonoTouch.CoreFoundation.DispatchQueue ("myQueue");
	outputRecorder = new OutputRecorder ();
	output.SetSampleBufferDelegateAndQueue (outputRecorder, queue);
	session.AddOutput (output);

	session.StartRunning ();
}

public class OutputRecorder : AVCaptureVideoDataOutputSampleBufferDelegate {
        public override void DidOutputSampleBuffer (AVCaptureOutput captureOutput, CMSampleBuffer sampleBuffer, AVCaptureConnection connection)
        {
                try {
                        var image = ImageFromSampleBuffer (sampleBuffer);

                        // Do something with the image, we just stuff it in our main view.
                        AppDelegate.ImageView.BeginInvokeOnMainThread (delegate {
                                AppDelegate.ImageView.Image = image;
                        });

                        //
                        // Although this looks innocent "Oh, he is just optimizing this case away"
                        // this is incredibly important to call on this callback, because the AVFoundation
                        // has a fixed number of buffers and if it runs out of free buffers, it will stop
                        // delivering frames.
                        //
                        sampleBuffer.Dispose ();
                } catch (Exception e){
                        Console.WriteLine (e);
                }
        }

        UIImage ImageFromSampleBuffer (CMSampleBuffer sampleBuffer)
        {
                // Get the CoreVideo image
                using (var pixelBuffer = sampleBuffer.GetImageBuffer () as CVPixelBuffer){
                        // Lock the base address
                        pixelBuffer.Lock (0);
                        // Get the number of bytes per row for the pixel buffer
                        var baseAddress = pixelBuffer.BaseAddress;
                        int bytesPerRow = pixelBuffer.BytesPerRow;
                        int width = pixelBuffer.Width;
                        int height = pixelBuffer.Height;
                        var flags = CGBitmapFlags.PremultipliedFirst | CGBitmapFlags.ByteOrder32Little;
                        // Create a CGImage on the RGB colorspace from the configured parameter above
                        using (var cs = CGColorSpace.CreateDeviceRGB ())
                        using (var context = new CGBitmapContext (baseAddress,width, height, 8, bytesPerRow, cs, (CGImageAlphaInfo) flags))
                        using (var cgImage = context.ToImage ()){
                                pixelBuffer.Unlock (0);
                                return UIImage.FromImage (cgImage);
                        }
                }
        }
}

Construtores

AVCaptureSession()

Construtor padrão que inicializa uma nova instância dessa classe sem parâmetros.

AVCaptureSession(IntPtr)

Um construtor usado ao criar representações gerenciadas de objetos não gerenciados; Chamado pelo runtime.

AVCaptureSession(NSObjectFlag)

Construtor para chamar classes derivadas para ignorar a inicialização e apenas alocar o objeto.

Propriedades

AutomaticallyConfiguresApplicationAudioSession

Se o AVCaptureSession usa a sessão de áudio compartilhado do aplicativo.

AutomaticallyConfiguresCaptureDeviceForWideColor

Obtém ou define um valor booliano que controla se a sessão deve ou não usar a cor larga automaticamente se ela estiver disponível.

Class

Coordena uma sessão de gravação.

(Herdado de NSObject)
ClassHandle

O identificador dessa classe.

DebugDescription

Uma descrição significativa do desenvolvedor desse objeto.

(Herdado de NSObject)
Description

Descrição do objeto, a versão Objective-C do ToString.

(Herdado de NSObject)
DidStartRunningNotification

Constante de notificação para DidStartRunning

DidStopRunningNotification

Constante de notificação para DidStopRunning

ErrorKey

Representa o valor associado à constante AVCaptureSessionErrorKey

Handle

Manipule (ponteiro) para a representação de objeto não gerenciado.

(Herdado de NSObject)
Inputs

Entradas para a sessão de captura.

Interrupted

Se a sessão foi interrompida.

InterruptionEndedNotification

Constante de notificação para InterruptionEnded

InterruptionReasonKey

Obtém uma chave que acessa o motivo pelo qual uma sessão de captura foi interrompida.

InterruptionSystemPressureStateKey

Coordena uma sessão de gravação.

IsDirectBinding

Coordena uma sessão de gravação.

(Herdado de NSObject)
IsProxy

Coordena uma sessão de gravação.

(Herdado de NSObject)
MasterClock

Um relógio somente leitura que fornece uma base de tempo para sincronizar carimbos de data/hora de vários dispositivos de entrada.

Outputs

Saídas para a sessão de captura.

Preset1280x720

Representa o valor associado à constante AVCaptureSessionPreset1280x720

Preset1920x1080

Representa o valor associado à constante AVCaptureSessionPreset1920x1080

Preset320x240

Coordena uma sessão de gravação.

Preset352x288

Representa o valor associado à constante AVCaptureSessionPreset352x288

Preset3840x2160

Representa o valor associado à constante AVCaptureSessionPreset3840x2160.

Preset640x480

Representa o valor associado à constante AVCaptureSessionPreset640x480

Preset960x540

Coordena uma sessão de gravação.

PresetHigh

Representa o valor associado à constante AVCaptureSessionPresetHigh

PresetiFrame1280x720

Representa o valor associado à constante AVCaptureSessionPresetiFrame1280x720

PresetiFrame960x540

Representa o valor associado à constante AVCaptureSessionPresetiFrame960x540

PresetInputPriority

Representa o valor associado à constante AVCaptureSessionPresetInputPriority

PresetLow

Representa o valor associado à constante AVCaptureSessionPresetLow

PresetMedium

Representa o valor associado à constante AVCaptureSessionPresetMedium

PresetPhoto

Representa o valor associado à constante AVCaptureSessionPresetPhoto

RetainCount

Retorna a contagem de retenção Objective-C atual para o objeto .

(Herdado de NSObject)
Running

Se a sessão de captura está em execução no momento.

RuntimeErrorNotification

Constante de notificação para RuntimeError

Self

Coordena uma sessão de gravação.

(Herdado de NSObject)
SessionPreset

A predefinição da sessão.

Superclass

Coordena uma sessão de gravação.

(Herdado de NSObject)
SuperHandle

Identificador usado para representar os métodos na classe base para este NSObject.

(Herdado de NSObject)
UsesApplicationAudioSession

Se a sessão deve usar a sessão de áudio compartilhado do aplicativo.

WasInterruptedNotification

Constante de notificação para WasInterrupted

Zone

Coordena uma sessão de gravação.

(Herdado de NSObject)

Métodos

AddConnection(AVCaptureConnection)

Adiciona a captura connectionespecificada.

AddInput(AVCaptureInput)

Adiciona uma entrada à Sessão de Captura

AddInputWithNoConnections(AVCaptureInput)

Adiciona o especificado input sem formar novas conexões.

AddObserver(NSObject, NSString, NSKeyValueObservingOptions, IntPtr)

Registra um objeto para ser observado externamente (usando NSString keyPath).   As alterações observadas são enviadas para o método de objeto ObserveValue(NSString, NSObject, NSDictionary, IntPtr) do observador.

(Herdado de NSObject)
AddObserver(NSObject, String, NSKeyValueObservingOptions, IntPtr)

Registra um objeto para ser observado externamente (usando keyPath de cadeia de caracteres).   As alterações observadas são enviadas para o método de objeto ObserveValue(NSString, NSObject, NSDictionary, IntPtr) do observador.

(Herdado de NSObject)
AddObserver(NSString, NSKeyValueObservingOptions, Action<NSObservedChange>)

Registra um objeto para ser observado externamente usando um método arbitrário.

(Herdado de NSObject)
AddObserver(String, NSKeyValueObservingOptions, Action<NSObservedChange>)

Registra um objeto para ser observado externamente usando um método arbitrário.

(Herdado de NSObject)
AddOutput(AVCaptureOutput)

Adiciona uma saída à sessão de captura.

AddOutputWithNoConnections(AVCaptureOutput)

Adiciona o especificado output sem formar novas conexões.

AwakeFromNib()

Chamado depois que o objeto tiver sido carregado do arquivo nib. Os substituidores devem chamar base. AwakeFromNib().

(Herdado de NSObject)
BeginConfiguration()

Inicia uma transação para alterar a configuração da Sessão de Captura.

BeginInvokeOnMainThread(Action)

Coordena uma sessão de gravação.

(Herdado de NSObject)
BeginInvokeOnMainThread(Selector, NSObject)

Invoca de forma assíncrona o código especificado no thread principal da interface do usuário.

(Herdado de NSObject)
Bind(NSString, NSObject, String, NSDictionary)

Coordena uma sessão de gravação.

(Herdado de NSObject)
Bind(String, NSObject, String, NSDictionary)
Obsoleto.

Coordena uma sessão de gravação.

(Herdado de NSObject)
BindingInfo(String)
Obsoleto.

Coordena uma sessão de gravação.

(Herdado de NSObject)
BindingOptionDescriptions(String)
Obsoleto.

Coordena uma sessão de gravação.

(Herdado de NSObject)
BindingValueClass(String)
Obsoleto.

Coordena uma sessão de gravação.

(Herdado de NSObject)
CanAddConnection(AVCaptureConnection)

Retornará true se o especificado connection puder ser adicionado.

CanAddInput(AVCaptureInput)

Retorna se a entrada fornecida pode ser adicionada à sessão.

CanAddOutput(AVCaptureOutput)

Retorna se a entrada fornecida pode ser adicionada à sessão.

CanSetSessionPreset(NSString)

Se a sessão dá suporte a um determinado conjunto de configurações de captura predefinidas.

CommitConfiguration()

Aplica atomicamente todas as alterações de configuração feitas na Sessão de Captura desde BeginConfiguration().

CommitEditing()

Coordena uma sessão de gravação.

(Herdado de NSObject)
CommitEditing(NSObject, Selector, IntPtr)

Coordena uma sessão de gravação.

(Herdado de NSObject)
ConformsToProtocol(IntPtr)

Invocado para determinar se esse objeto implementa o protocolo especificado.

(Herdado de NSObject)
Copy()

Executa uma cópia do objeto Objective-C subjacente.

(Herdado de NSObject)
DangerousAutorelease()

Coordena uma sessão de gravação.

(Herdado de NSObject)
DangerousRelease()

Coordena uma sessão de gravação.

(Herdado de NSObject)
DangerousRetain()

Coordena uma sessão de gravação.

(Herdado de NSObject)
DidChange(NSKeyValueChange, NSIndexSet, NSString)

Indica que ocorreu uma alteração nos índices de uma relação para muitos.

(Herdado de NSObject)
DidChange(NSString, NSKeyValueSetMutationKind, NSSet)

Coordena uma sessão de gravação.

(Herdado de NSObject)
DidChangeValue(String)

Indica que ocorreu uma alteração na chave especificada.

(Herdado de NSObject)
Dispose()

Libera os recursos usados pelo objeto NSObject.

(Herdado de NSObject)
Dispose(Boolean)

Libera os recursos usados pelo objeto NSObject.

(Herdado de NSObject)
DoesNotRecognizeSelector(Selector)

Indica que esse objeto não reconhece o seletor especificado.

(Herdado de NSObject)
Equals(NSObject)

Coordena uma sessão de gravação.

(Herdado de NSObject)
Equals(Object)

Coordena uma sessão de gravação.

(Herdado de NSObject)
ExposedBindings()

Coordena uma sessão de gravação.

(Herdado de NSObject)
GetBindingInfo(NSString)

Coordena uma sessão de gravação.

(Herdado de NSObject)
GetBindingOptionDescriptions(NSString)

Coordena uma sessão de gravação.

(Herdado de NSObject)
GetBindingValueClass(NSString)

Coordena uma sessão de gravação.

(Herdado de NSObject)
GetDictionaryOfValuesFromKeys(NSString[])

Recupera os valores das chaves especificadas.

(Herdado de NSObject)
GetHashCode()

Gera um código hash para a instância atual.

(Herdado de NSObject)
GetMethodForSelector(Selector)

Coordena uma sessão de gravação.

(Herdado de NSObject)
GetNativeField(String)
Obsoleto.

Coordena uma sessão de gravação.

(Herdado de NSObject)
GetNativeHash()

Coordena uma sessão de gravação.

(Herdado de NSObject)
Init()

Coordena uma sessão de gravação.

(Herdado de NSObject)
InitializeHandle(IntPtr)

Coordena uma sessão de gravação.

(Herdado de NSObject)
InitializeHandle(IntPtr, String)

Coordena uma sessão de gravação.

(Herdado de NSObject)
Invoke(Action, Double)

Coordena uma sessão de gravação.

(Herdado de NSObject)
Invoke(Action, TimeSpan)

Coordena uma sessão de gravação.

(Herdado de NSObject)
InvokeOnMainThread(Action)

Coordena uma sessão de gravação.

(Herdado de NSObject)
InvokeOnMainThread(Selector, NSObject)

Invoca de forma síncrona o código especificado no thread principal da interface do usuário.

(Herdado de NSObject)
IsEqual(NSObject)

Coordena uma sessão de gravação.

(Herdado de NSObject)
IsKindOfClass(Class)

Coordena uma sessão de gravação.

(Herdado de NSObject)
IsMemberOfClass(Class)

Coordena uma sessão de gravação.

(Herdado de NSObject)
MarkDirty()

Promove um objeto par regular (IsDirectBinding é true) em um objeto toggleref.

(Herdado de NSObject)
MutableCopy()

Cria uma cópia mutável do NSObject especificado.

(Herdado de NSObject)
ObjectDidEndEditing(NSObject)

Coordena uma sessão de gravação.

(Herdado de NSObject)
ObserveValue(NSString, NSObject, NSDictionary, IntPtr)

Indica que o valor no keyPath especificado em relação a esse objeto foi alterado.

(Herdado de NSObject)
PerformSelector(Selector)

Coordena uma sessão de gravação.

(Herdado de NSObject)
PerformSelector(Selector, NSObject)

Coordena uma sessão de gravação.

(Herdado de NSObject)
PerformSelector(Selector, NSObject, Double)

Invoca o seletor na instância atual e, se o obj não for nulo, ele passará isso como seu único parâmetro.

(Herdado de NSObject)
PerformSelector(Selector, NSObject, Double, NSString[])

Coordena uma sessão de gravação.

(Herdado de NSObject)
PerformSelector(Selector, NSObject, NSObject)

Coordena uma sessão de gravação.

(Herdado de NSObject)
PerformSelector(Selector, NSThread, NSObject, Boolean)

Coordena uma sessão de gravação.

(Herdado de NSObject)
PerformSelector(Selector, NSThread, NSObject, Boolean, NSString[])

Coordena uma sessão de gravação.

(Herdado de NSObject)
PrepareForInterfaceBuilder()

Coordena uma sessão de gravação.

(Herdado de NSObject)
RemoveConnection(AVCaptureConnection)

Remove o connection especificado.

RemoveInput(AVCaptureInput)

Remove a fonte de entrada especificada.

RemoveObserver(NSObject, NSString)

Impede que o observador especificado receba mais notificações de valores alterados para o keyPath especificado.

(Herdado de NSObject)
RemoveObserver(NSObject, NSString, IntPtr)

Impede que o observador especificado receba notificações adicionais de valores alterados para o keyPath e o contexto especificados.

(Herdado de NSObject)
RemoveObserver(NSObject, String)

Impede que o observador especificado receba mais notificações de valores alterados para o keyPath especificado.

(Herdado de NSObject)
RemoveObserver(NSObject, String, IntPtr)

Impede que o observador especificado receba notificações adicionais de valores alterados para o keyPath e o contexto especificados.

(Herdado de NSObject)
RemoveOutput(AVCaptureOutput)

Remove a saída especificada.

RespondsToSelector(Selector)

Se esse objeto reconhece o seletor especificado.

(Herdado de NSObject)
SetNativeField(String, NSObject)
Obsoleto.

Coordena uma sessão de gravação.

(Herdado de NSObject)
SetNilValueForKey(NSString)

Define o valor da chave especificada como nulo.

(Herdado de NSObject)
SetValueForKey(NSObject, NSString)

Define o valor da propriedade especificada pela chave como o valor especificado.

(Herdado de NSObject)
SetValueForKeyPath(IntPtr, NSString)

Um construtor usado ao criar representações gerenciadas de objetos não gerenciados; Chamado pelo runtime.

(Herdado de NSObject)
SetValueForKeyPath(NSObject, NSString)

Define o valor de uma propriedade que pode ser alcançada usando um keypath.

(Herdado de NSObject)
SetValueForUndefinedKey(NSObject, NSString)

Indica uma tentativa de gravar um valor em uma chave indefinida. Se não for substituído, gerará um NSUndefinedKeyException.

(Herdado de NSObject)
SetValuesForKeysWithDictionary(NSDictionary)

Define os valores desse NSObject para aqueles no dicionário especificado.

(Herdado de NSObject)
StartRunning()

Inicia o fluxo de entradas e saídas.

StopRunning()

Interrompe de forma assíncrona o fluxo de entradas e saídas.

ToString()

Retorna uma representação de cadeia de caracteres do valor da instância atual.

(Herdado de NSObject)
Unbind(NSString)

Coordena uma sessão de gravação.

(Herdado de NSObject)
Unbind(String)
Obsoleto.

Coordena uma sessão de gravação.

(Herdado de NSObject)
ValueForKey(NSString)

Retorna o valor da propriedade associada à chave especificada.

(Herdado de NSObject)
ValueForKeyPath(NSString)

Retorna o valor de uma propriedade que pode ser alcançada usando um keypath.

(Herdado de NSObject)
ValueForUndefinedKey(NSString)

Indica uma tentativa de ler um valor de uma chave indefinida. Se não for substituído, gerará um NSUndefinedKeyException.

(Herdado de NSObject)
WillChange(NSKeyValueChange, NSIndexSet, NSString)

Indica que os valores dos índices especificados na chave especificada estão prestes a ser alterados.

(Herdado de NSObject)
WillChange(NSString, NSKeyValueSetMutationKind, NSSet)

Coordena uma sessão de gravação.

(Herdado de NSObject)
WillChangeValue(String)

Indica que o valor da chave especificada está prestes a ser alterado.

(Herdado de NSObject)

Métodos de Extensão

ObjectDidBeginEditing(NSObject, INSEditor)

Coordena uma sessão de gravação.

ObjectDidEndEditing(NSObject, INSEditor)

Coordena uma sessão de gravação.

GetValidModes(NSObject, NSFontPanel)

Coordena uma sessão de gravação.

ValidateToolbarItem(NSObject, NSToolbarItem)

Coordena uma sessão de gravação.

GetDebugDescription(INSObjectProtocol)

Coordena uma sessão de gravação.

AcceptsPreviewPanelControl(NSObject, QLPreviewPanel)

Coordena uma sessão de gravação.

BeginPreviewPanelControl(NSObject, QLPreviewPanel)

Coordena uma sessão de gravação.

EndPreviewPanelControl(NSObject, QLPreviewPanel)

Coordena uma sessão de gravação.

GetAccessibilityCustomRotors(NSObject)

Obtém a matriz de UIAccessibilityCustomRotor objetos apropriados para this o objeto .

SetAccessibilityCustomRotors(NSObject, UIAccessibilityCustomRotor[])

Define a matriz de UIAccessibilityCustomRotor objetos apropriados para this o objeto .

Aplica-se a

Confira também