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];
...
Tipagem forte, mas...
...você pode associar qualquer tipo a um id
- (void) argumentoObjetoGenerico: (id) bijeto;//by @sr_v...
Por segurança, ganhamos alguns métodos bacanas:
- (BOOL)isKindOfClass:(Class)aClass;
- (BOOL)isMemberOfClass:(Class)aClass...
@interface Burro : NSObject
- (void) zurra;
@end
Interface .h
#import "Burro.h"
@implementation Burro
- (void) zurra
{
NSL...
#import "Burro.h"
@interface Burro (Pato)
- (void) quack;
@end
#import "Pato.h"
@implementation Burro (Pato)
- (void) quac...
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, c...
Na interface declaramos nossa propriedade
@property (nonatomic, retain) Objeto *atributo;
Meia lua pra trás-frente soco na...
Voltando, como é feita a busca dos métodos?
NSObject contém apenas um atributo privado:
@interface NSObject <NSObject> {
C...
Logo, a busca dos métodos é feita da seguinte forma:
+ (BOOL)resolveInstanceMethod:(SEL)sel;
YES
id objc_msgSend(id self, ...
-(id)forwardingTargetForSelector:(SEL)selector;
Você pode delegar a chamada do método para
outro objeto, um atributo por e...
Mas afinal, o que é um método?
BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types);
void dynamicFoo(id se...
MethodSwizzling
Method fooMethod = class_getInstanceMethod([pato class], @selector(foo));
Method barMethod = class_getInst...
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/...
Upcoming SlideShare
Loading in …5
×

Objective-C e o dinamismo da linguagem

1,685 views

Published on

Published in: Technology
  • Be the first to comment

Objective-C e o dinamismo da linguagem

  1. 1. Objective-C e o dinamismo da linguagem Diego Chohfi Turini @dchohfi [self SP]; Monday, March 19, 12
  2. 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. 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. 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. 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. 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. 7. não podemos adicionar variáveis de Mas, com categories instância :( Monday, March 19, 12
  8. 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. 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. 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. 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. 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. 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. 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. 15. There’s no private variables :P NSLog(@"%@", [patoDemo valueForKey:@"isa"]); Monday, March 19, 12
  16. 16. Obrigado :) Monday, March 19, 12
  17. 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

×