SlideShare a Scribd company logo
1 of 17
Download to read offline
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

More Related Content

What's hot

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
 

What's hot (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
 

Objetive-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