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:
- 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.
- 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. - 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 depoismethodSignatureForSelector:eforwardInvocation:.
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.