Upload
khoa-pham
View
222
Download
0
Tags:
Embed Size (px)
DESCRIPTION
Introduction to Objective-C Runtime and its benefits
Citation preview
Objective C RuntimeKhoa Pham2359Media
Today● self = [super init]● objc_msgSend● ObjC Runtime● How to use the Runtime API● Use cases
self = [super init]ETPAnimal *cat = [ETPAnimal cat];NSInteger recordCount = [ETPCoreDataManager recordCount];
self = [super init]@interface ETPCat : ETPAnimal@end
ETPCat *cat = [[ETPCat alloc] init]
self = [super init]- (id)init{
self = [super init];if (self) {
// ETPCat does it own initialization here}return self;
}
self = [super init][super init] calls the superclass implementation of init with the (hidden) self argument.
It can do one of these things+ set some properties on self, and return self+ return a different object (factory, singleton)+ return nil
self = [super init]ETPCat *cat = [ETPCat alloc] // 0x1111111a[cat init] // 0x1111111b[cat meomeo] // 0x1111111a
self = [super init]
Demo
objc_msgSendETPCat *cat = [[ETPCat alloc] init][cat setName:@”meo”]
objc_msgSend(cat, @selector(setName:), @”meo”)
objc_msgSend
Demo
objc_msgSend
@selectorSEL selector1 = @selector(initWithName:)SEL selector2 = @selector(initWithFriends1Name::)
typedef struct objc_selector *SEL
Read more at Objective C Runtime Reference -> Data Structure -> Class definition Data structure -> SEL
@selector
Demo
Objective C RuntimeThe Objective-C Runtime is a Runtime Library, it's a library written mainly in C & Assembler that adds the Object Oriented capabilities to C to create Objective-C.
Objective C RuntimeSource code http://www.opensource.apple.com/source/objc4/objc4-532/runtime/objc-class.mm
There are two versions of the Objective-C runtime—“modern” and “legacy”. The modern version was introduced with Objective-C 2.0 and includes a number of new features.
Objective C RuntimeDynamic featureObject oriented capability
Objective C RuntimeFeatures● Class elements (categories, methods, variables,
property, …)● Object● Messaging● Object introspection
Objective C Runtime@interface ETPAnimal : NSObject@end
typedef struct objc_class *Class;
Objective C Runtime (old)struct objc_class {
Class isa;
Class super_class OBJC2_UNAVAILABLE;
const char *name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
struct objc_cache *cache OBJC2_UNAVAILABLE;
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
}
Objective C Runtimetypedef struct class_ro_t {
const char * name; const ivar_list_t * ivars;
} class_ro_t
typedef struct class_rw_t {
const class_ro_t *ro; method_list_t **methods;struct class_t *firstSubclass; struct class_t *nextSiblingClass;
} class_rw_t;
Objective C RuntimeETPAnimal *animal = [[ETPAnimal alloc] init]
struct objc_object{
Class isa;// variables
};
Objective C Runtimeid someAnimal = [[ETPAnimal alloc] init]
typedef struct objc_object{ Class isa;} *id;
Objective C RuntimeClass is also an object, its isa pointer points to its meta class
The metaclass is the description of the class object
Objective C Runtime
Objective C Runtime
Demo
Objective C Runtime● Dynamic typing● Dynamic binding● Dynamic method resolution● Introspection
Objective C RuntimeDynamic typingDynamic typing enables the runtime to determine the type of an object at runtime
id cat = [[ETPCat alloc] init]- (void)acceptAnything:(id)anything;
Objective C RuntimeDynamic bindingDynamic binding is the process of mapping a message to a method at runtime, rather than at compile time
Objective C RuntimeDynamic method resolutionProvide the implementation of a method dynamically.
@dynamic
Objective C RuntimeIntrospection
isKindOfClassrespondsToSelectorconformsToProtocol
How to use the Runtime APIObjective-C programs interact with the runtime system to implement the dynamic features of the language.
● Objective-C source code● Foundation Framework NSObject methods● Runtime library API
Use casesMethod swizzle (IIViewDeckController)JSON Model (Torin ‘s BaseModel)Message forwardingMeta programming
Use casesMethod swizzle
Use casesMethod swizzle (IIViewDeckController)
SEL presentVC = @selector(presentViewController:animated:completion:);
SEL vdcPresentVC = @selector(vdc_presentViewController:animated:completion:);
method_exchangeImplementations(class_getInstanceMethod(self, presentVC),
class_getInstanceMethod(self, vdcPresentVC));
Use casesMethod swizzle (IIViewDeckController)
- (void)vdc_presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)
animated completion:(void (^)(void))completion {
UIViewController* controller = self.viewDeckController ?: self;
[controller vdc_presentViewController:viewControllerToPresent animated:animated completion:
completion]; // when we get here, the vdc_ method is actually the old, real method
}
Use casesJSON Model (Torin ‘s BaseModel)
updateWithDictionary
class_copyIvarList
ivar_getName
Use casesJSON Model (Torin ‘s BaseModel)
@interface ETPItem : BaseModel
@property (nonatomic, copy) NSString * ID;
@property (nonatomic, copy) NSString *name;
@end
ETPItem *item = [[ETPItem alloc] init];
[item updateWithDictionary:@{@”ID”: @”1”, @”name”: @”item1”}];
Message forwarding
Use casesMeta programming
● Dynamic method naming
● Validation
● Template
● Mocking
Reference1. http://cocoasamurai.blogspot.com/2010/01/understanding-objective-c-runtime.html
2. http://www.slideshare.net/mudphone/what-makes-objective-c-dynamic
3. http://www.cocoawithlove.com/2009/04/what-does-it-mean-when-you-assign-super.html
4. http://nshipster.com/method-swizzling/
5. http://stackoverflow.com/questions/415452/object-orientation-in-c
6. http://stackoverflow.com/questions/2766233/what-is-the-c-runtime-library
7. http://gcc.gnu.org/onlinedocs/gcc/Modern-GNU-Objective-C-runtime-API.html
8. http://www.opensource.apple.com/source/objc4/objc4-532/runtime/objc-class.mm
9. http://www.friday.com/bbum/2009/12/18/objc_msgsend-part-1-the-road-map/
10. https://www.mikeash.com/pyblog/friday-qa-2010-01-29-method-replacement-for-fun-and-profit.html
11. Pro Objective C, chapter 7, 8, 9
12. Effective Objective C, chapter 2
13. http://wiki.gnustep.org/index.php/ObjC2_FAQ
Thank youQ&A