O documento discute os conceitos de tipagem dinâmica e forte no Objective-C, como métodos podem ser adicionados dinamicamente a objetos usando categories e associated objects, e como a busca de métodos é feita usando a propriedade isa de um objeto.
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
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