Objective C Runtime

16bebb36e0e28572a316ba0450e190d1?s=47 Khoa Pham
August 27, 2015

Objective C Runtime

Learn the runtime that powers our app


Khoa Pham

August 27, 2015


  1. Objective C Runtime Khoa Pham 2359Media

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

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

    recordCount = [ETPCoreDataManager recordCount];
  4. self = [super init] @interface ETPCat : ETPAnimal @end ETPCat

    *cat = [[ETPCat alloc] init]
  5. self = [super init] - (id)init { self = [super

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

    0x1111111a [cat init] // 0x1111111b [cat meomeo] // 0x1111111a
  8. self = [super init] Demo

  9. objc_msgSend ETPCat *cat = [[ETPCat alloc] init] [cat setName:@”meo”] objc_msgSend(cat,

    @selector(setName:), @”meo”)
  10. objc_msgSend Demo

  11. objc_msgSend

  12. @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
  13. @selector Demo

  14. 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.
  15. 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.
  16. Objective C Runtime Dynamic feature Object oriented capability

  17. Objective C Runtime Features • Class elements (categories, methods, variables,

    property, …) • Object • Messaging • Object introspection
  18. Objective C Runtime @interface ETPAnimal : NSObject @end typedef struct

    objc_class *Class;
  19. 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; }
  20. 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;
  21. Objective C Runtime ETPAnimal *animal = [[ETPAnimal alloc] init] struct

    objc_object { Class isa; // variables };
  22. Objective C Runtime id someAnimal = [[ETPAnimal alloc] init] typedef

    struct objc_object { Class isa; } *id;
  23. 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
  24. Objective C Runtime

  25. None
  26. Objective C Runtime Demo

  27. Objective C Runtime • Dynamic typing • Dynamic binding •

    Dynamic method resolution • Introspection
  28. 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;
  29. Objective C Runtime Dynamic binding Dynamic binding is the process

    of mapping a message to a method at runtime, rather than at compile time
  30. Objective C Runtime Dynamic method resolution Provide the implementation of

    a method dynamically. @dynamic
  31. Objective C Runtime Introspection isKindOfClass respondsToSelector conformsToProtocol

  32. 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
  33. Use cases Method swizzle (IIViewDeckController) JSON Model (Torin ‘s BaseModel)

    Message forwarding Meta programming
  34. Use cases Method swizzle

  35. 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));
  36. 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 }
  37. Use cases JSON Model (Torin ‘s BaseModel) updateWithDictionary class_copyIvarList ivar_getName

  38. 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”}];
  39. Message forwarding

  40. Use cases Meta programming • Dynamic method naming • Validation

    • Template • Mocking
  41. 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
  42. Thank you Q&A