objective-c: under the hood
DESCRIPTION
A talk originally presented at NSMeetup in San Francisco. This was a very dense talk that focused on a few principles which allow us to build an "Object Oriented" (as defined by me) framework in pure C. After establishing a bag of tricks, we explain which tricks the Objective-C runtime uses to build class hierarchies, resolve methods, etc. I would love to give this talk again if you have a group that would rather go over this topic live.TRANSCRIPT
![Page 1: Objective-C: Under The Hood](https://reader037.vdocuments.site/reader037/viewer/2022102700/554fb05ab4c90586258b50d7/html5/thumbnails/1.jpg)
Objective-C:Under the Hood
Thomas Bouldininlined@
![Page 2: Objective-C: Under The Hood](https://reader037.vdocuments.site/reader037/viewer/2022102700/554fb05ab4c90586258b50d7/html5/thumbnails/2.jpg)
Before we Start
![Page 3: Objective-C: Under The Hood](https://reader037.vdocuments.site/reader037/viewer/2022102700/554fb05ab4c90586258b50d7/html5/thumbnails/3.jpg)
OOP• Objective-C: The other “C with
Classes”
• What is Object Oriented Programming?
![Page 4: Objective-C: Under The Hood](https://reader037.vdocuments.site/reader037/viewer/2022102700/554fb05ab4c90586258b50d7/html5/thumbnails/4.jpg)
+1
It’s All Just Memory
int magic[] = {0xDEADBEEF, 0xBAADF00D};
DEADBEEF BAADF00D
int x = magic[1];
x = *(ptr + 1);int *ptr = magic;
![Page 5: Objective-C: Under The Hood](https://reader037.vdocuments.site/reader037/viewer/2022102700/554fb05ab4c90586258b50d7/html5/thumbnails/5.jpg)
DE AD BE EF BA AD F0 0D
+1?
It’s All Just Memoryvoid *scary_ptr = magic;
(scary_ptr + 1)x = *
![Page 6: Objective-C: Under The Hood](https://reader037.vdocuments.site/reader037/viewer/2022102700/554fb05ab4c90586258b50d7/html5/thumbnails/6.jpg)
+1 (int length)
It’s All Just Memory
DE AD BE EF BA AD F0 0D
void *scary_ptr = magic;
(scary_ptr + 1 )x = * * sizeof(int)
![Page 7: Objective-C: Under The Hood](https://reader037.vdocuments.site/reader037/viewer/2022102700/554fb05ab4c90586258b50d7/html5/thumbnails/7.jpg)
+1 (int length)
It’s All Just Memory
DE AD BE EF BA AD F0 0D
void *scary_ptr = magic;
(scary_ptr + 1 )x = * * sizeof(int)(int *)
![Page 8: Objective-C: Under The Hood](https://reader037.vdocuments.site/reader037/viewer/2022102700/554fb05ab4c90586258b50d7/html5/thumbnails/8.jpg)
It’s All Just Memory
00 00 00 4260 0D 72 A8 h o m a s ␀t
0x600D 72A8
User *thomas; // {42, “thomas”}thomas->name;
x
xchar *name =
typedef struct { int id; char *name;} User;} User;
![Page 9: Objective-C: Under The Hood](https://reader037.vdocuments.site/reader037/viewer/2022102700/554fb05ab4c90586258b50d7/html5/thumbnails/9.jpg)
It’s All Just Memory
00 00 00 4260 0D 72 A8 h o m a s ␀t
0x600D 72A8
User *thomas; // {42, “thomas”}thomas->name;
sizeof(int)
char *name =sizeof(int)
typedef struct { int id; char *name;} User;} User;
![Page 10: Objective-C: Under The Hood](https://reader037.vdocuments.site/reader037/viewer/2022102700/554fb05ab4c90586258b50d7/html5/thumbnails/10.jpg)
It’s All Just Memorytypedef struct { int id; char *name;
00 00 00 4260 0D 72 A8
char *name = (char *)( ); + sizeof(int)(void *)thomas
} User;
![Page 11: Objective-C: Under The Hood](https://reader037.vdocuments.site/reader037/viewer/2022102700/554fb05ab4c90586258b50d7/html5/thumbnails/11.jpg)
It’s All Just Memorytypedef struct { int id; char *name;
00 00 00 4260 0D 72 A8
char *name = (char *)( ); + sizeof(int)(void *)thomas
int created_at;} Member;
![Page 12: Objective-C: Under The Hood](https://reader037.vdocuments.site/reader037/viewer/2022102700/554fb05ab4c90586258b50d7/html5/thumbnails/12.jpg)
Extensions• C-level extensions: It has the same
prefix
• This is how the BSD socket library works
• Could call the struct* parameter “this” or “self”
• C++ does, but hides it from you
• Toll-free bridging of class clusters
![Page 13: Objective-C: Under The Hood](https://reader037.vdocuments.site/reader037/viewer/2022102700/554fb05ab4c90586258b50d7/html5/thumbnails/13.jpg)
if (Animal->kind == DOG) { puts(“Woof!”); } else if (Animal->kind == PARAKEET) { puts(“Tweet!”); } else { assert(false); // Can’t happen }
void speak(Animal *animal) {
}
Polymorphism// Dog & Parakeet share Animal prefixstruct Animal, Dog, Parakeet;
// Please don’t git blame this
![Page 14: Objective-C: Under The Hood](https://reader037.vdocuments.site/reader037/viewer/2022102700/554fb05ab4c90586258b50d7/html5/thumbnails/14.jpg)
Polymorphismtypedef struct { void (*speak)(Animal *);} Animal;
void Dog_speak(Animal *) { puts(“Woof”);}
void Parakeet_speak(Animal *self) { puts(“%s wants a cracker”, self);}
Dog hearshey = {&Dog_speak};Parakeet jello = {&Parakeet_speak};
![Page 15: Objective-C: Under The Hood](https://reader037.vdocuments.site/reader037/viewer/2022102700/554fb05ab4c90586258b50d7/html5/thumbnails/15.jpg)
Polymorphism?
• We cannot assume two objects of the same type behave the same
• Indirection can solve (or create) any problem
![Page 16: Objective-C: Under The Hood](https://reader037.vdocuments.site/reader037/viewer/2022102700/554fb05ab4c90586258b50d7/html5/thumbnails/16.jpg)
Polymorphism!
typedef struct { void (*speak)(Animal *);} Animal_klass;
typedef struct { Animal_klass *isa;} Animal;extern Animal_klass _dog, _parakeet;
![Page 17: Objective-C: Under The Hood](https://reader037.vdocuments.site/reader037/viewer/2022102700/554fb05ab4c90586258b50d7/html5/thumbnails/17.jpg)
Polymorphism!
animal->isa->speak(animal);
if (animal->isa == _dog)
// in C++: animal->speak();// or just speak();
// Can your C++ do this?
// What about isKindOfClass:?
![Page 18: Objective-C: Under The Hood](https://reader037.vdocuments.site/reader037/viewer/2022102700/554fb05ab4c90586258b50d7/html5/thumbnails/18.jpg)
Build Objective-C
• @YES, @“Parse”
• @protocol ?
• @interface/implementation?
• @selector
![Page 19: Objective-C: Under The Hood](https://reader037.vdocuments.site/reader037/viewer/2022102700/554fb05ab4c90586258b50d7/html5/thumbnails/19.jpg)
Objective-C Method
• SEL is a stringyou can ==
• IMP is a C func:
• typedef void (*IMP)(id self, SEL sel, ...);
• Method is a struct with an IMP, SEL, and char * typeinfo
![Page 20: Objective-C: Under The Hood](https://reader037.vdocuments.site/reader037/viewer/2022102700/554fb05ab4c90586258b50d7/html5/thumbnails/20.jpg)
Objective-C Object
typedef struct objc_class *Class;
typedef struct objc_object { Class isa;} *id;
id object = (id)malloc( class->instance_size);
// struct size can be dynamic
object->isa = class;
![Page 21: Objective-C: Under The Hood](https://reader037.vdocuments.site/reader037/viewer/2022102700/554fb05ab4c90586258b50d7/html5/thumbnails/21.jpg)
Objective-C Class@interface PFSample : NSObject- (void)foo;+ (void)bar;@end
id obj = [[PFSample alloc] init];
isaobj
isasuperclass-foo
PFSample
isasuperclass+bar
PFSample (Meta)
NSObject
![Page 22: Objective-C: Under The Hood](https://reader037.vdocuments.site/reader037/viewer/2022102700/554fb05ab4c90586258b50d7/html5/thumbnails/22.jpg)
Sending Messages[animal eat:food];
objc_msgSend(animal, “eat”, food);
-[PFKeet eat:]( animal, “eat”, food);
![Page 23: Objective-C: Under The Hood](https://reader037.vdocuments.site/reader037/viewer/2022102700/554fb05ab4c90586258b50d7/html5/thumbnails/23.jpg)
Method Resolution
isabird
isasuperclassmethod_list
PFKeet
[bird fly];
isasuperclassmethod_list
PFBird
“perch” -[PFKeet perch] “fly” -[PFBird fly]
![Page 24: Objective-C: Under The Hood](https://reader037.vdocuments.site/reader037/viewer/2022102700/554fb05ab4c90586258b50d7/html5/thumbnails/24.jpg)
Et. al.
• Protocols
• Categories
• Properties
• Blocks
• ivars
![Page 25: Objective-C: Under The Hood](https://reader037.vdocuments.site/reader037/viewer/2022102700/554fb05ab4c90586258b50d7/html5/thumbnails/25.jpg)
VTable Optimization
• New to Objective C 2.0!
• Fixed set of IMPs, determined at runtime
• Classes can share with super
• Default IMP is objc_msgSend
![Page 26: Objective-C: Under The Hood](https://reader037.vdocuments.site/reader037/viewer/2022102700/554fb05ab4c90586258b50d7/html5/thumbnails/26.jpg)
Wrap UpPFUser *user = [[PFUser alloc] init];user.username = @”thomas”;user.password = @”NSMeetup”;[user signUpInBackground: ^(BOOL success){ if (success) { NSLog(@”Yey!”); }}];
![Page 27: Objective-C: Under The Hood](https://reader037.vdocuments.site/reader037/viewer/2022102700/554fb05ab4c90586258b50d7/html5/thumbnails/27.jpg)
Questions?
Annotated slide deck available athttp://inlined.me/objc.pdf
Follow me at @inlinedContact me at [email protected]
Want to build the platform devs love?Send a POST to
https://parse.com/jobs/apply