Last active
April 19, 2018 21:56
-
-
Save Catfish-Man/ad9fe0ca44f9a5f31a44 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//Given this: | |
NSArray *objects = @[@1, @2, @3] | |
//These are equivalent in behavior | |
NSNumber *first = [objects objectAtIndex:0] | |
NSNumber *second = (NSNumber *)CFArrayGetValueAtIndex(objects, 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