SlideShare une entreprise Scribd logo
1  sur  17
Télécharger pour lire hors ligne
Objective-C
e o dinamismo da linguagem
Diego Chohfi Turini
@dchohfi
[self SP];
Monday, March 19, 12
Tipagem dinâmica,
Podemos chamar um método que não está
declarado na sua interface.
Pato* patoFeio = [[Pato alloc] init];
[patoFeio late]; -> warning, não error.
OMG
Monday, March 19, 12
Tipagem forte, mas...
...você pode associar qualquer tipo a um id
- (void) argumentoObjetoGenerico: (id) bijeto;//by @sr_valeriano :P
(referência a qualquer coisa em memória)
Ou obrigar que ele siga um protocolo
- (void) argumentoComProtocolo: (id<Protocolo>) bijeto;
@optional@required
Monday, March 19, 12
Por segurança, ganhamos alguns métodos bacanas:
- (BOOL)isKindOfClass:(Class)aClass;
- (BOOL)isMemberOfClass:(Class)aClass;
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
- (BOOL)respondsToSelector:(SEL)aSelector;
Mas como é feita a busca de métodos no objeto?
No objeto? Na classe?Vai pensando..
Monday, March 19, 12
@interface Burro : NSObject
- (void) zurra;
@end
Interface .h
#import "Burro.h"
@implementation Burro
- (void) zurra
{
NSLog(@"INON");//WTF?
}
@end
Implementação .m
...nosso burro, que só sabe zurrar(?)
Agora,
Como podemos “pimpar” nosso burro?
Quero que meu burro seja um pato!
Monday, March 19, 12
#import "Burro.h"
@interface Burro (Pato)
- (void) quack;
@end
#import "Pato.h"
@implementation Burro (Pato)
- (void) quack
{
NSLog(@"QUAAAACK");
}
@end
=D
Com categories, nosso burro pode ser um pato! :P
Monday, March 19, 12
não podemos adicionar variáveis de
Mas, com categories
instância :(
Monday, March 19, 12
Com referência associativa você pode
(id) objc_getAssociatedObject(target, const* key);
objc_setAssociatedObject(target, const* key, id object, objc_AssociationPolicy policy);
*não sou eu
Coloque essa inhaca dentro de get/set
que fica “lindo”
Monday, March 19, 12
Na interface declaramos nossa propriedade
@property (nonatomic, retain) Objeto *atributo;
Meia lua pra trás-frente soco na implementação
static const char *ObjetoKey = "ObjetoKey";
@dynamic atributo;//O atributo precisa ser @dynamic
- (Bijeto *)atributo {
return (Bijeto *) objc_getAssociatedObject(self, ObjetoKey);
}
- (void)setAtributo:(Bijeto *)atributo{
objc_setAssociatedObject(self, ObjetoKey, atributo,
OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
Monday, March 19, 12
Voltando, como é feita a busca dos métodos?
NSObject contém apenas um atributo privado:
@interface NSObject <NSObject> {
Class!isa;
}
a busca então é feita na isa, um atributo do objeto.
Monday, March 19, 12
Logo, a busca dos métodos é feita da seguinte forma:
+ (BOOL)resolveInstanceMethod:(SEL)sel;
YES
id objc_msgSend(id self, SEL op, ...)
NO
agora começa a brincadeira :P
Monday, March 19, 12
-(id)forwardingTargetForSelector:(SEL)selector;
Você pode delegar a chamada do método para
outro objeto, um atributo por exemplo:
E o method_missing?
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;
NSMethodSignature é a compilação do SEL
-(void)forwardInvocation:(NSInvocation *)anInvocation;
forwardInvocation é o nosso method_missing :P
Monday, March 19, 12
Mas afinal, o que é um método?
BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types);
void dynamicFoo(id self, SEL _cmd)
{
NSLog(@"dooing magic foo");
}
Pato *patoDinamico = [[Pato alloc] init];
[patoDinamico foo]; //da erro
class_addMethod([patoDinamico class], @selector(foo), (IMP) dynamicFoo, "v@:");
[patoDinamico foo]; //agora lindão :P
Podemos adicionar um método na classe:
Monday, March 19, 12
MethodSwizzling
Method fooMethod = class_getInstanceMethod([pato class], @selector(foo));
Method barMethod = class_getInstanceMethod([pato class], @selector(bar));
method_exchangeImplementations(fooMethod, barMethod);
[patoDinamico foo]; //chama bar
[patoDinamico bar]; //chama foo
ISA Switching
object_setClass(exPato, NSClassFromString(@"Burro"));
Monday, March 19, 12
There’s no private variables :P
NSLog(@"%@", [patoDemo valueForKey:@"isa"]);
Monday, March 19, 12
Obrigado :)
Monday, March 19, 12
Referência:
http://cocoasamurai.blogspot.com/2010/01/understanding-
objective-c-runtime.html
http://akitaonrails.com/2010/12/06/objective-c-method-
missing
http://developer.apple.com/library/ios/#documentation/
cocoa/Conceptual/ObjCRuntimeGuide/Introduction/
Introduction.html
Objective-C Pocket Reference
Monday, March 19, 12

Contenu connexe

Tendances

Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...
Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...
Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...Ricardo Valeriano
 
Mágica com qt’s meta object system
Mágica com qt’s meta object systemMágica com qt’s meta object system
Mágica com qt’s meta object systemRodrigo Delduca
 
(Portuguese) Java EE Poliglota
(Portuguese) Java EE Poliglota(Portuguese) Java EE Poliglota
(Portuguese) Java EE PoliglotaPhil Calçado
 
As Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoAs Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoPaulo Morgado
 
Introdução à programação em Android e iOS - OOP em ObjC
Introdução à programação em Android e iOS - OOP em ObjCIntrodução à programação em Android e iOS - OOP em ObjC
Introdução à programação em Android e iOS - OOP em ObjCLuís Gustavo Martins
 
Web2py: Desenvolvimento Ágil de Aplicações Web com Python
Web2py: Desenvolvimento Ágil de Aplicações Web com PythonWeb2py: Desenvolvimento Ágil de Aplicações Web com Python
Web2py: Desenvolvimento Ágil de Aplicações Web com Pythonchackero
 

Tendances (9)

Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...
Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...
Qcon SP 2012, 5 (ou mais) coisas que você gostaria de saber sobre o iOS e o O...
 
Mágica com qt’s meta object system
Mágica com qt’s meta object systemMágica com qt’s meta object system
Mágica com qt’s meta object system
 
(Portuguese) Java EE Poliglota
(Portuguese) Java EE Poliglota(Portuguese) Java EE Poliglota
(Portuguese) Java EE Poliglota
 
As Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoAs Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPonto
 
Aula VHDL
Aula VHDLAula VHDL
Aula VHDL
 
Introdução à programação em Android e iOS - OOP em ObjC
Introdução à programação em Android e iOS - OOP em ObjCIntrodução à programação em Android e iOS - OOP em ObjC
Introdução à programação em Android e iOS - OOP em ObjC
 
OOP ObjC
OOP ObjCOOP ObjC
OOP ObjC
 
Trabalhando com as views do Web2Py
Trabalhando com as views do Web2PyTrabalhando com as views do Web2Py
Trabalhando com as views do Web2Py
 
Web2py: Desenvolvimento Ágil de Aplicações Web com Python
Web2py: Desenvolvimento Ágil de Aplicações Web com PythonWeb2py: Desenvolvimento Ágil de Aplicações Web com Python
Web2py: Desenvolvimento Ágil de Aplicações Web com Python
 

Dernier

ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx2m Assessoria
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploDanilo Pinotti
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsDanilo Pinotti
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx2m Assessoria
 

Dernier (6)

ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 

Objective-C e o dinamismo da linguagem

  • 1. Objective-C e o dinamismo da linguagem Diego Chohfi Turini @dchohfi [self SP]; Monday, March 19, 12
  • 2. Tipagem dinâmica, Podemos chamar um método que não está declarado na sua interface. Pato* patoFeio = [[Pato alloc] init]; [patoFeio late]; -> warning, não error. OMG Monday, March 19, 12
  • 3. Tipagem forte, mas... ...você pode associar qualquer tipo a um id - (void) argumentoObjetoGenerico: (id) bijeto;//by @sr_valeriano :P (referência a qualquer coisa em memória) Ou obrigar que ele siga um protocolo - (void) argumentoComProtocolo: (id<Protocolo>) bijeto; @optional@required Monday, March 19, 12
  • 4. Por segurança, ganhamos alguns métodos bacanas: - (BOOL)isKindOfClass:(Class)aClass; - (BOOL)isMemberOfClass:(Class)aClass; - (BOOL)conformsToProtocol:(Protocol *)aProtocol; - (BOOL)respondsToSelector:(SEL)aSelector; Mas como é feita a busca de métodos no objeto? No objeto? Na classe?Vai pensando.. Monday, March 19, 12
  • 5. @interface Burro : NSObject - (void) zurra; @end Interface .h #import "Burro.h" @implementation Burro - (void) zurra { NSLog(@"INON");//WTF? } @end Implementação .m ...nosso burro, que só sabe zurrar(?) Agora, Como podemos “pimpar” nosso burro? Quero que meu burro seja um pato! Monday, March 19, 12
  • 6. #import "Burro.h" @interface Burro (Pato) - (void) quack; @end #import "Pato.h" @implementation Burro (Pato) - (void) quack { NSLog(@"QUAAAACK"); } @end =D Com categories, nosso burro pode ser um pato! :P Monday, March 19, 12
  • 7. não podemos adicionar variáveis de Mas, com categories instância :( Monday, March 19, 12
  • 8. Com referência associativa você pode (id) objc_getAssociatedObject(target, const* key); objc_setAssociatedObject(target, const* key, id object, objc_AssociationPolicy policy); *não sou eu Coloque essa inhaca dentro de get/set que fica “lindo” Monday, March 19, 12
  • 9. Na interface declaramos nossa propriedade @property (nonatomic, retain) Objeto *atributo; Meia lua pra trás-frente soco na implementação static const char *ObjetoKey = "ObjetoKey"; @dynamic atributo;//O atributo precisa ser @dynamic - (Bijeto *)atributo { return (Bijeto *) objc_getAssociatedObject(self, ObjetoKey); } - (void)setAtributo:(Bijeto *)atributo{ objc_setAssociatedObject(self, ObjetoKey, atributo, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } Monday, March 19, 12
  • 10. Voltando, como é feita a busca dos métodos? NSObject contém apenas um atributo privado: @interface NSObject <NSObject> { Class!isa; } a busca então é feita na isa, um atributo do objeto. Monday, March 19, 12
  • 11. Logo, a busca dos métodos é feita da seguinte forma: + (BOOL)resolveInstanceMethod:(SEL)sel; YES id objc_msgSend(id self, SEL op, ...) NO agora começa a brincadeira :P Monday, March 19, 12
  • 12. -(id)forwardingTargetForSelector:(SEL)selector; Você pode delegar a chamada do método para outro objeto, um atributo por exemplo: E o method_missing? - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector; NSMethodSignature é a compilação do SEL -(void)forwardInvocation:(NSInvocation *)anInvocation; forwardInvocation é o nosso method_missing :P Monday, March 19, 12
  • 13. Mas afinal, o que é um método? BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types); void dynamicFoo(id self, SEL _cmd) { NSLog(@"dooing magic foo"); } Pato *patoDinamico = [[Pato alloc] init]; [patoDinamico foo]; //da erro class_addMethod([patoDinamico class], @selector(foo), (IMP) dynamicFoo, "v@:"); [patoDinamico foo]; //agora lindão :P Podemos adicionar um método na classe: Monday, March 19, 12
  • 14. MethodSwizzling Method fooMethod = class_getInstanceMethod([pato class], @selector(foo)); Method barMethod = class_getInstanceMethod([pato class], @selector(bar)); method_exchangeImplementations(fooMethod, barMethod); [patoDinamico foo]; //chama bar [patoDinamico bar]; //chama foo ISA Switching object_setClass(exPato, NSClassFromString(@"Burro")); Monday, March 19, 12
  • 15. There’s no private variables :P NSLog(@"%@", [patoDemo valueForKey:@"isa"]); Monday, March 19, 12