Sobes.tech
Intern

O que acontecerá se acessar o objeto?

sobes.tech IA

Resposta da IA

Enviar uma mensagem a um objeto. Se o objeto tiver um método com o nome (seletor) correspondente, ele será executado. Caso contrário, ocorrerá um erro em tempo de execução (seletor não reconhecido enviado à instância), a menos que o objeto implemente um mecanismo de reencaminhamento de mensagens.

O mecanismo de reencaminhamento de mensagens em Objective-C/Swift consiste em várias etapas:

  1. Despacho dinâmico: O ambiente de execução procura a implementação do método (IMP) para esse seletor na classe do objeto e suas superclasses.
  2. Adição dinâmica de métodos: Se a implementação não for encontrada, o ambiente de execução chama o método +resolveInstanceMethod: (para instâncias) ou +resolveClassMethod: (para classes), para dar à classe a oportunidade de adicionar dinamicamente a implementação do método.
  3. Reencaminhamento de mensagens: Se o método ainda não for encontrado ou adicionado, o ambiente de execução tenta reencaminhar a mensagem para outro objeto, chamando os métodos forwardingTargetForSelector: e depois methodSignatureForSelector: e forwardInvocation:.

Se nenhuma dessas etapas resultar no tratamento da mensagem, ocorre uma exceção NSInvalidArgumentException.

Exemplo em Objective-C:

@implementation MyObject

- (void)myMethod {
    // Implementação do método
    NSLog(@"myMethod called");
}

@end

// ...
MyObject *obj = [[MyObject alloc] init];
[obj myMethod]; // Envio da mensagem myMethod

Exemplo em Swift (implícito):

class MySwiftObject {
    func mySwiftMethod() {
        // Implementação do método
        print("mySwiftMethod called")
    }
}

let swiftObj = MySwiftObject()
swiftObj.mySwiftMethod() // Envio da mensagem mySwiftMethod (por despacho dinâmico padrão)

O acesso às propriedades do objeto em Swift por padrão usa despacho estático para let e var sem @objc dynamic. No entanto, se a propriedade for marcada como @objc dynamic, o acesso a ela também usará despacho dinâmico, semelhante ao envio de mensagens em Objective-C.