Your SlideShare is downloading. ×
Objective-C e o dinamismo da linguagem
Objective-C e o dinamismo da linguagem
Objective-C e o dinamismo da linguagem
Objective-C e o dinamismo da linguagem
Objective-C e o dinamismo da linguagem
Objective-C e o dinamismo da linguagem
Objective-C e o dinamismo da linguagem
Objective-C e o dinamismo da linguagem
Objective-C e o dinamismo da linguagem
Objective-C e o dinamismo da linguagem
Objective-C e o dinamismo da linguagem
Objective-C e o dinamismo da linguagem
Objective-C e o dinamismo da linguagem
Objective-C e o dinamismo da linguagem
Objective-C e o dinamismo da linguagem
Objective-C e o dinamismo da linguagem
Objective-C e o dinamismo da linguagem
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Objective-C e o dinamismo da linguagem

1,409

Published on

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,409
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
33
Comments
0
Likes
3
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 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
  • 16. Obrigado :) Monday, March 19, 12
  • 17. 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

×