-
-
Save OliverLetterer/53b200b790071d4f2e33 to your computer and use it in GitHub Desktop.
Revisions
-
Catfish-Man created this gist
Feb 7, 2016 .There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,31 @@ //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]