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. Objective C Runtime
    Khoa Pham
    2359Media

    View Slide

  2. Today
    ● self = [super init]
    ● objc_msgSend
    ● ObjC Runtime
    ● How to use the Runtime API
    ● Use cases

    View Slide

  3. self = [super init]
    ETPAnimal *cat = [ETPAnimal cat];
    NSInteger recordCount = [ETPCoreDataManager
    recordCount];

    View Slide

  4. self = [super init]
    @interface ETPCat : ETPAnimal
    @end
    ETPCat *cat = [[ETPCat alloc] init]

    View Slide

  5. self = [super init]
    - (id)init
    {
    self = [super init];
    if (self) {
    // ETPCat does it own initialization here
    }
    return self;
    }

    View Slide

  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

    View Slide

  7. self = [super init]
    ETPCat *cat = [ETPCat alloc] // 0x1111111a
    [cat init] // 0x1111111b
    [cat meomeo] // 0x1111111a

    View Slide

  8. self = [super init]
    Demo

    View Slide

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

    View Slide

  10. objc_msgSend
    Demo

    View Slide

  11. objc_msgSend

    View Slide

  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

    View Slide

  13. @selector
    Demo

    View Slide

  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.

    View Slide

  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.

    View Slide

  16. Objective C Runtime
    Dynamic feature
    Object oriented capability

    View Slide

  17. Objective C Runtime
    Features
    ● Class elements (categories, methods, variables,
    property, …)
    ● Object
    ● Messaging
    ● Object introspection

    View Slide

  18. Objective C Runtime
    @interface ETPAnimal : NSObject
    @end
    typedef struct objc_class *Class;

    View Slide

  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;
    }

    View Slide

  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;

    View Slide

  21. Objective C Runtime
    ETPAnimal *animal = [[ETPAnimal alloc] init]
    struct objc_object
    {
    Class isa;
    // variables
    };

    View Slide

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

    View Slide

  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

    View Slide

  24. Objective C Runtime

    View Slide

  25. View Slide

  26. Objective C Runtime
    Demo

    View Slide

  27. Objective C Runtime
    ● Dynamic typing
    ● Dynamic binding
    ● Dynamic method resolution
    ● Introspection

    View Slide

  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;

    View Slide

  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

    View Slide

  30. Objective C Runtime
    Dynamic method resolution
    Provide the implementation of a method dynamically.
    @dynamic

    View Slide

  31. Objective C Runtime
    Introspection
    isKindOfClass
    respondsToSelector
    conformsToProtocol

    View Slide

  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

    View Slide

  33. Use cases
    Method swizzle (IIViewDeckController)
    JSON Model (Torin ‘s BaseModel)
    Message forwarding
    Meta programming

    View Slide

  34. Use cases
    Method swizzle

    View Slide

  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));

    View Slide

  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
    }

    View Slide

  37. Use cases
    JSON Model (Torin ‘s BaseModel)
    updateWithDictionary
    class_copyIvarList
    ivar_getName

    View Slide

  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”}];

    View Slide

  39. Message forwarding

    View Slide

  40. Use cases
    Meta programming
    ● Dynamic method naming
    ● Validation
    ● Template
    ● Mocking

    View Slide

  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

    View Slide

  42. Thank you
    Q&A

    View Slide