Objective-C Runtime overview

Preview:

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

Recommended