Skip to content

Instantly share code, notes, and snippets.

@OliverLetterer
Forked from Catfish-Man/tollfree.m
Created February 7, 2016 08:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save OliverLetterer/53b200b790071d4f2e33 to your computer and use it in GitHub Desktop.
Save OliverLetterer/53b200b790071d4f2e33 to your computer and use it in GitHub Desktop.
//Given this:
NSArray *objects = @[@1, @2, @3]
//These are equivalent in behavior
NSNumber *first = [objects objectAtIndex:0]
NSNumber *second = (NSNumber *)CFArrayGetValueAtIndex(0)
//But is the code that runs the same? Not so much… in the first one we do…
objc_msgSend(objects, <selector reference>, 0)
-> http://sealiesoftware.com/msg/x86-mavericks.html
-> -[__NSArrayI objectAtIndex:]
-> check if index is in bounds
-> return _list[0]
//In the second one we do…
CFArrayGetValueAtIndex()
-> CFArrayGetTypeID()
-> dispatch_once()
-> grab __kCFArrayTypeID
-> CF_IS_OBJC() (see http://opensource.apple.com/source/CF/CF-744.19/CFInternal.h)
-> check if objects is a tagged pointer (if (objects & 1))
-> check if objects->isa is 0
-> check if objects->isa is the constant string class
-> check if __kCFArrayTypeID is small enough to be in the bridged classes array
-> grab the class for __kCFArrayTypeID from the bridged classes array
-> check if the class we grabbed is the same as objects->isa
-> objc_msgSend(objects, <selector reference>, 0)
-> http://sealiesoftware.com/msg/x86-mavericks.html
-> -[__NSArrayI objectAtIndex:]
-> check if index is in bounds
-> return _list[0]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment