Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Objective C Runtime

Khoa Pham
August 27, 2015

Objective C Runtime

Learn the runtime that powers our app

Khoa Pham

August 27, 2015
Tweet

More Decks by Khoa Pham

Other Decks in Programming

Transcript

  1. Today • self = [super init] • objc_msgSend • ObjC

    Runtime • How to use the Runtime API • Use cases
  2. self = [super init] ETPAnimal *cat = [ETPAnimal cat]; NSInteger

    recordCount = [ETPCoreDataManager recordCount];
  3. self = [super init] - (id)init { self = [super

    init]; if (self) { // ETPCat does it own initialization here } return self; }
  4. 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
  5. self = [super init] ETPCat *cat = [ETPCat alloc] //

    0x1111111a [cat init] // 0x1111111b [cat meomeo] // 0x1111111a
  6. @selector SEL 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
  7. Objective C Runtime The 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.
  8. Objective C Runtime Source 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.
  9. Objective C Runtime Features • Class elements (categories, methods, variables,

    property, …) • Object • Messaging • Object introspection
  10. 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; }
  11. Objective C Runtime typedef 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;
  12. Objective C Runtime Class is also an object, its isa

    pointer points to its meta class The metaclass is the description of the class object
  13. Objective C Runtime • Dynamic typing • Dynamic binding •

    Dynamic method resolution • Introspection
  14. Objective C Runtime Dynamic typing Dynamic typing enables the runtime

    to determine the type of an object at runtime id cat = [[ETPCat alloc] init] - (void)acceptAnything:(id)anything;
  15. Objective C Runtime Dynamic binding Dynamic binding is the process

    of mapping a message to a method at runtime, rather than at compile time
  16. How to use the Runtime API Objective-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
  17. Use cases Method 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));
  18. Use cases Method 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 }
  19. Use cases JSON 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”}];
  20. Reference 1. 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