Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Secrets of Objective-C

Secrets of Objective-C

Objective-C is a fascinating language, bridging the object-oriented ideas of Smalltalk with the procedural underpinnings of C. This talk will explore how this curious intersection of programming paradigms influences the design and structure of modern OS X and iOS applications, drawing examples from some of the more obscure corners of Apple’s system frameworks.

Presented at the SendHub Tech Talk on 6/28/2014.
Video available here: https://www.youtube.com/watch?v=2KK_ay_mpGQ&list=PLC8Wr4QyrgQQpL7LkDd_GyvWFbXHM3rzd

Mattt Thompson

April 28, 2014
Tweet

More Decks by Mattt Thompson

Other Decks in Programming

Transcript

  1. SECRETS OF
    OBJECTIVE-C

    View Slide

  2. __bridge BETWEEN WORLDS

    View Slide

  3. SMALLTALK & C

    View Slide

  4. SMALLTALK
    1972
    ALAN KAY, DAN INGALLS,
    & ADELE GOLDBERG
    OBJECT-ORIENTED, LISP INSPIRED, MESSAGE PASSING

    View Slide

  5. [object message:parameter]

    View Slide

  6. View Slide

  7. C
    1972
    DENNIS RITCHIE
    PROCEDURAL, ALGOL INSPIRED

    View Slide

  8. UNIX

    View Slide

  9. CHOCOLATE +
    PEANUT BUTTER

    View Slide

  10. PHILOSOPHER +
    A BAZOOKA

    View Slide

  11. OBJECTIVE-C
    1983
    BRAD COX & TOM LOVE
    STATIC, DYNAMIC, WEAK

    View Slide

  12. View Slide


  13. View Slide

  14. NS

    View Slide

  15. View Slide

  16. STATIC, DYNAMIC, WEAK

    View Slide

  17. id object = @"foo";

    View Slide

  18. [object performSelector:@selector(bar)];

    View Slide

  19. ?

    View Slide

  20. nil, Nil, NULL

    View Slide

  21. View Slide

  22. OBJECTIVE-C IS GETTING
    BETTER FASTER THAN
    ALMOST ANY OTHER
    LANGUAGE

    View Slide

  23. ARC
    AUTOMATIC REFERENCE COUNTING

    View Slide

  24. TIOBE
    "PROGRAMMING LANGUAGE OF THE YEAR: 2012"

    View Slide

  25. View Slide

  26. OBJECTIVE-C:
    THE GOOD PARTS

    View Slide

  27. View Slide

  28. View Slide

  29. KVC
    KEY-VALUE CODING

    View Slide

  30. [person valueForKey:@"name"]

    View Slide

  31. [person valueForKeyPath:@"spouse.name"]

    View Slide

  32. [people valueForKeyPath:@"name"]

    View Slide

  33. [people valueForKeyPath:@"@avg.salary"]

    View Slide

  34. ▸ @count
    ▸ @sum
    ▸ @avg
    ▸ @max
    ▸ @min

    View Slide

  35. objc/runtime.h

    View Slide

  36. METHOD SWIZZLING
    ASSOCIATED OBJECTS
    DYNAMIC CLASS DEFINITION

    View Slide

  37. @compatibility_alias

    View Slide

  38. FRAMEWORKS

    View Slide

  39. GCD
    GRAND CENTRAL DISPATCH

    View Slide

  40. dispatch_queue_t queue = dispatch_queue_create("queue", NULL);
    dispatch_async(queue, ^{
    // Do work asynchronously...
    dispatch_async(dispatch_get_main_queue(), ^{
    // Return with result
    });
    });

    View Slide

  41. - (void)performActionWithObject:(id)object
    completionBlock:(void (^)(id result, NSError *error))block {
    // Do work asynchronously...
    if (block) {
    // Return with result
    block(result);
    }
    }

    View Slide

  42. FOUNDATION
    THE STANDARD LIBRARY LANGUAGES WOULD
    kill FOR

    View Slide

  43. LINGUISTICS APIS

    View Slide

  44. NSSTRING

    View Slide

  45. NSLINGUISTICTAGGER
    ▸ Token
    ▸ Lexical Class
    ▸ Name
    ▸ Lemma
    ▸ Language & Script

    View Slide

  46. NSString *question = @"What is the weather in San Francisco?";
    NSLinguisticTaggerOptions options =
    NSLinguisticTaggerOmitWhitespace |
    NSLinguisticTaggerOmitPunctuation |
    NSLinguisticTaggerJoinNames;
    NSLinguisticTagger *tagger =
    [[NSLinguisticTagger alloc] initWithTagSchemes:
    [NSLinguisticTagger availableTagSchemesForLanguage:@"en"]
    options:options];
    tagger.string = question;
    [tagger enumerateTagsInRange:NSMakeRange(0, [question length])
    scheme:NSLinguisticTagSchemeNameTypeOrLexicalClass
    options:options
    usingBlock:
    ^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop) {
    NSString *token = [question substringWithRange:tokenRange];
    NSLog(@"%@: %@", token, tag);
    }];

    View Slide

  47. WHAT: PRONOUN
    IS: VERB
    THE: DETERMINER
    WEATHER: NOUN
    IN: PREPOSITION
    SAN FRANCISCO: PLACENAME

    View Slide

  48. LANGUAGE: ENGLISH

    View Slide

  49. NSDATADETECTOR

    View Slide

  50. ▸ Date
    ▸ Address
    ▸ Link
    ▸ Phone Number
    ▸ Transit Information

    View Slide

  51. NSDataDetector *detector =
    [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeAddress
    | NSTextCheckingTypePhoneNumber
    error:nil];
    NSString *string = @"123 Main St. / (555) 555-5555";
    [detector enumerateMatchesInString:string
    options:kNilOptions
    range:NSMakeRange(0, [string length])
    usingBlock:
    ^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
    NSLog(@"Match: %@", result);
    }];

    View Slide

  52. CFSTRINGTRANSFORM
    API FOR ICU TRANSFORMS

    View Slide

  53. Énġlišh långuãge lẳcks iñterêßţing diaçrïtičş

    View Slide

  54. View Slide

  55. {PIG FACE}

    View Slide

  56. HELLO! ͜Μʹͪ͸! สวัสดี! م
    ر
    ح
    ب
    ا ! 䓟޷!

    View Slide

  57. Hello! kon'nichiha! s̄wạs̄dī! mrḥbạ! nín hǎo!

    View Slide

  58. Hello! kon'nichiha! swasdi! mrhba! nin hao!

    View Slide

  59. (hello, kon'nichiha, swasdi, mrhba, nin, hao)

    View Slide

  60. DATE & TIME
    PROGRAMMING

    View Slide

  61. NSCALENDAR
    GREGORIAN, BUDDHIST, CHINESE, HEBREW,
    ISLAMIC, ISLAMIC CIVIL, JAPANESE,
    REPUBLIC OF CHINA, PERSIAN, INDIAN

    View Slide

  62. NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
    dateComponents.weekday = 0;
    dateComponents.hour = 2;
    [calendar enumerateDatesStartingAfterDate:[NSDate date]
    matchingComponents:dateComponents
    options:NSCalendarMatchNextTime
    usingBlock:
    ^(NSDate *date, BOOL exactMatch, BOOL *stop) {
    NSLog(@"%@", date);
    }];

    View Slide

  63. URL LOADING
    SYSTEM

    View Slide

  64. NSURLREQUEST, NSURLRESPONSE,
    NSURLCONNECTION, NSURLSESSION,
    NSURLCACHE, NSHTTPCOOKIE,
    NSURLPROTOCOL,
    NSURLAUTHENTICATIONCHALLENGE

    View Slide

  65. NSURL & NSURLCOMPONENTS
    RFC1808, RFC 2396, RFC3986

    View Slide

  66. SORT DESCRIPTORS,
    PREDICATES, &
    EXPRESSIONS

    View Slide

  67. NSSortDescriptor *firstNameSortDescriptor =
    [NSSortDescriptor sortDescriptorWithKey:@"firstName"
    ascending:YES
    selector:@selector(localizedStandardCompare:)];
    NSSortDescriptor *lastNameSortDescriptor =
    [NSSortDescriptor sortDescriptorWithKey:@"lastName"
    ascending:YES
    selector:@selector(localizedStandardCompare:)];
    NSSortDescriptor *ageSortDescriptor =
    [NSSortDescriptor sortDescriptorWithKey:@"age"
    ascending:NO];

    View Slide

  68. NSPredicate *bobPredicate =
    [NSPredicate predicateWithFormat:@"firstName = 'Bob'"];
    NSPredicate *smithPredicate =
    [NSPredicate predicateWithFormat:@"lastName = %@", @"Smith"];
    NSPredicate *thirtiesPredicate =
    [NSPredicate predicateWithFormat:@"age >= 30"];

    View Slide

  69. NSExpression *expression =
    [NSExpression expressionWithFormat:@"4 + 5 - 2**3"];
    id value = [expression expressionValueWithObject:nil
    context:nil];
    // => 1

    View Slide

  70. NSERROR

    View Slide

  71. @try{}
    @catch(NSException){}
    @finally{}

    View Slide

  72. error:(NSError * __autoreleasing *)error

    View Slide

  73. LOCALIZATION

    View Slide

  74. INTERNATIONALIZATION

    View Slide

  75. ACCESSIBILITY

    View Slide

  76. ε-(´ɾʆ)

    View Slide

  77. Dozens OF
    SYSTEM
    FRAMEWORKS

    View Slide

  78. View Slide

  79. COMMUNITY

    View Slide

  80. COCOAPODS
    DEPENDENCY MANAGER FOR OBJECTIVE-C
    cocoapods.org

    View Slide

  81. 4638 PODS

    View Slide

  82. ALCATRAZ
    XCODE PLUGIN MANAGER
    alcatraz.io

    View Slide

  83. 116 PLUGINS

    View Slide

  84. NS—

    View Slide

  85. @MATTT

    View Slide

  86. Thanks!

    View Slide