$30 off During Our Annual Pro Sale. View Details »

From Ruby to Objective-C

高見龍
November 27, 2013

From Ruby to Objective-C

because Ruby and Objective-C has the same ancestor, they have many things in common, and in this talk I mainly talk about what I learned in Ruby, borrow those experiences and move to Objective-C :)

Ruby Tuesday #27 @Taiwan

高見龍

November 27, 2013
Tweet

More Decks by 高見龍

Other Decks in Programming

Transcript

  1. View Slide

  2. from Ruby to Objective-C

    View Slide

  3. View Slide

  4. I’m a Ruby guy (≈ 5 years)
    I’m a iOS app guy (≈ 3 years)
    I’m a Flash guy (≈ 9 years)
    I’m a Python guy (≈ 3 years)

    View Slide

  5. Ruby > Rails

    View Slide

  6. Current Status
    80% iOS app, 20% Ruby/Rails

    View Slide

  7. 100% Ruby Lover!

    View Slide

  8. Rails Girls Taipei

    View Slide

  9. Rails Girls Taipei

    View Slide

  10. WebConf Taiwan 2014

    View Slide

  11. Today, I’m NOT talking about..
    how to use Ruby to write iOS app!

    View Slide

  12. I’m going to talk about..

    View Slide

  13. what I learned in Ruby…

    View Slide

  14. and move to Objective-C

    View Slide

  15. after all, our life, time and
    resources are limited

    View Slide

  16. View Slide

  17. what about Objective-C?

    View Slide

  18. “it has god dame long method name
    and weird parameters!”
    Objective-C …
    NSArray* languages = [NSArray arrayWithObjects:@"Ruby", @"PHP",
    @"Objective-C", nil];
    !
    [languages enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL
    *stop) {
    NSLog(@"language = %@", obj);
    }];

    View Slide

  19. “what the hell is the square bracket!”
    Objective-C …
    NSString* myName = @"eddie kao";
    NSLog(@"%@", [myName uppercaseString]);

    View Slide

  20. “WTF! my app crashed again!!”
    Objective-C …

    View Slide

  21. Introduction

    View Slide

  22. Ruby was born on 1993
    Objective-C was born on 1983

    View Slide

  23. they have the same ancestor

    View Slide

  24. Smalltalk
    photo by Marcin Wichary

    View Slide

  25. Ruby is general-purpose
    Objective-C mainly used in
    Mac/iOS app development

    View Slide

  26. Ruby != Rails
    Objective-C != Cocoa Framework

    View Slide

  27. they have something in common..

    View Slide

  28. both Ruby and Objective-C are
    Object-Oriented

    View Slide

  29. both Ruby and Objective-C are
    strongly typed language.

    View Slide

  30. Ruby is a dynamic language
    Objective-C is a dynamic language

    View Slide

  31. both Ruby and Objective-C are
    Dynamic Typing

    View Slide

  32. Type checking..
    - (void) makeSomeNoise:(id) sender
    {
    if ([sender isKindOfClass:[RobberDuck class]])
    {
    RobberDuck* duck = (RobberDuck *) sender;
    [duck quack];
    }
    }

    View Slide

  33. or you can do this..
    - (void) makeSomeNoise:(id) sender
    {
    if ([sender respondsToSelector:@selector(quack)])
    {
    [sender quack];
    }
    }

    View Slide

  34. View Slide

  35. id

    View Slide

  36. Objective-C is superset of C

    View Slide

  37. Objective-C is still C

    View Slide

  38. NSString, NSArray, NSNumber…

    View Slide

  39. NextSTEP

    View Slide

  40. CF… = Core Foundation
    CG… = Core Graphic
    CL… = Core Location
    CA… = Core Animation
    UI… = User Interface

    View Slide

  41. OOP

    View Slide

  42. everything in Ruby is an object…

    View Slide

  43. and almost everything in
    Objective-C is an objects..

    View Slide

  44. there’re still some primitive data
    types in Objective-C

    View Slide

  45. object model
    class Animal
    end
    !
    class Dog < Animal
    end

    View Slide

  46. object model
    dog = Dog.new
    !
    puts "class of dog is #{dog.class}” # Dog
    puts "superclass of dog is #{dog.class.superclass}” # Animal
    puts "super superclass of dog is
    #{dog.class.superclass.superclass}” # Object
    puts "super super superclass of dog is
    #{dog.class.superclass.superclass.superclass}” # BasicObject
    !
    puts "class of Dog is #{Dog.class}” # Class
    puts "class class of Dog is #{Dog.class.class}” # Class
    puts "class of Animal is #{Animal.class}” # Class
    puts "class of Object is #{Object.class}” # Class

    View Slide

  47. object model
    @interface Animal : NSObject
    @end
    !
    @implementation Animal
    @end
    !
    @interface Dog : Animal
    @end
    !
    @implementation Dog
    @end

    View Slide

  48. object model
    Dog* dog = [[Dog alloc] init];
    !
    NSLog(@"class of dog is %@", [dog class]); # Dog
    !
    NSLog(@"superclass of dog is %@", [dog superclass]); # Animal
    !
    NSLog(@"super superclass of dog is %@", [[dog superclass] superclass]); #
    NSObject
    !
    NSLog(@"super super superclass of dog is %@", [[[dog superclass]
    superclass] superclass]); # null

    View Slide

  49. Object Model
    reference: http://goo.gl/wYL6gT

    View Slide

  50. method & message

    View Slide

  51. method definition
    - (void) sayHello:(id)someOne withMessage:(NSString *)message
    {
    NSLog(@"Hello %@, %@", someOne, message);
    }
    def say_hello(someone, message)
    puts "Hello #{someone}, #{message}"
    end

    View Slide

  52. sending message
    [dog walk];
    dog.walk() # or you can omit the parentheses

    View Slide

  53. [fox saySomething:@"hi, Ruby"];
    fox.say_something "hi, Ruby" # what does the fox say?
    sending message

    View Slide

  54. sending message
    puts 1 + 2
    puts 1.+(2)
    puts 1.send(:+, 2)

    View Slide

  55. sending message
    class Bank
    def save(money)
    puts "you just saved #{money} dollars"
    end
    end
    !
    bank = Bank.new
    bank.save 20 # you just saved 20 dollars
    bank.send(:save, 20) # you just saved 20 dollars

    View Slide

  56. sending message
    @interface Bank : NSObject
    - (void) save:(NSNumber *) money;
    @end
    !
    @implementation Bank
    - (void)save:(NSNumber *)money
    {
    NSLog(@"you just saved %@ dollars", money);
    }
    @end
    !
    Bank* bank = [[Bank alloc] init];
    [bank save:@20];
    [bank performSelector:@selector(save:) withObject:@20];

    View Slide

  57. block

    View Slide

  58. block
    p1 = Proc.new { puts "Hello, Proc Block" }
    p1.call
    !
    p2 = lambda { puts "Hello, Lambda Block" }
    p2.call

    View Slide

  59. block
    ^{ };

    View Slide

  60. block
    typedef void (^MyBlock)(void);
    int age = 18;
    MyBlock theBlock = ^{
    NSLog(@"Hello, Objective-C Block, your age = %d", age);
    };
    !
    theBlock(); # Hello, Objective-C Block, your age = 18
    !
    age = 38;
    theBlock(); # guess what’s the age?

    View Slide

  61. block
    3.times { |i| puts i }
    NSArray* list = @[@1, @2, @3];
    [list enumerateObjectsUsingBlock:^(NSNumber* num,
    NSUInteger idx, BOOL *stop) {
    NSLog(@"%@", num);
    }];

    View Slide

  62. iteration

    View Slide

  63. iteration
    list = [1, 2, 3, 4, 5]
    !
    sum = 0
    !
    list.each { |num|
    sum += num
    }
    !
    puts "sum = #{sum}"

    View Slide

  64. iteration
    NSArray* list = @[@1, @2, @3, @4, @5];
    !
    __block int sum = 0;
    !
    [list enumerateObjectsUsingBlock:^(NSNumber* num,
    NSUInteger idx, BOOL *stop) {
    sum += [num intValue];
    }];
    !
    NSLog(@"sum = %d", sum);

    View Slide

  65. iteration
    class Fox
    def say
    puts "what does the fox say?"
    end
    end
    !
    fox1 = Fox.new
    fox2 = Fox.new
    fox3 = Fox.new
    foxes = [fox1, fox2, fox3]
    !
    foxes.map { |fox| fox.say }
    # what does the fox say?

    View Slide

  66. iteration
    @interface Fox : NSObject
    - (void) say;
    @end
    !
    @implementation Fox
    - (void) say
    {
    NSLog(@"what does the fox say?!");
    }
    @end

    View Slide

  67. iteration
    Fox* fox1 = [[Fox alloc] init];
    Fox* fox2 = [[Fox alloc] init];
    Fox* fox3 = [[Fox alloc] init];
    !
    NSArray* foxes = @[fox1, fox2, fox3];
    !
    [foxes makeObjectsPerformSelector:@selector(say)];

    View Slide

  68. add methods at runtime

    View Slide

  69. Open class
    class String
    def is_awesome?
    return true if self == "Ruby Tuesday"
    end
    end
    !
    puts "Ruby Tuesday".is_awesome?

    View Slide

  70. Category
    @interface NSString(RubyTuesday)
    - (BOOL) isAwesome;
    @end
    !
    @implementation NSString(RubyTuesday)
    - (BOOL) isAwesome
    {
    if ([self isEqualToString:@"Ruby Tuesday"]){
    return YES;
    }
    return NO;
    }
    @end

    View Slide

  71. Category
    NSString* meetup = @"Ruby Tuesday";
    if ([meetup isAwesome])
    {
    NSLog(@"AWESOME!");
    }

    View Slide


  72. Working with Classes
    class_getName
    class_getSuperclass
    class_getInstanceVariable
    class_getClassVariable
    class_addIvar
    class_copyIvarList
    class_addMethod
    class_getInstanceMethod
    class_getClassMethod
    class_replaceMethod
    class_respondsToSelector
    ..
    reference: http://goo.gl/BEikIM

    View Slide

  73. Working with Instances
    object_copy
    object_dispose
    object_setInstanceVariable
    object_getInstanceVariable
    object_getIndexedIvars
    object_getIvar
    object_setIvar
    object_getClassName
    object_getClass
    object_setClass
    ..
    reference: http://goo.gl/BEikIM

    View Slide

  74. reflection
    - (BOOL) isKindOfClass:(Class) aClass
    - (BOOL) isMemberOfClass:(Class) aClass
    - (BOOL) respondsToSelector:(SEL) aSelector
    - (BOOL) conformsToProtocol:(Protocol *) aProtocol
    ..
    reference: http://goo.gl/fgmJcg

    View Slide

  75. ecosystem

    View Slide

  76. open source projects on Github
    Ruby : 76,574
    Objective-C : 22,959

    View Slide

  77. Ruby : bundler
    source 'https://rubygems.org'
    !
    gem 'rails', '3.2.8'
    gem 'mysql2'
    !
    group :assets do
    gem 'sass-rails', '~> 3.2.3'
    gem "bootstrap-sass"
    end
    !
    gem "kaminari"
    gem "simple_form"
    gem "carrierwave"
    gem 'unicorn'

    View Slide

  78. Objective-C : cocoapods
    platform :ios, '6.0'
    !
    pod 'Facebook-iOS-SDK', '~> 3.5.1’
    pod 'JSONKit', '~> 1.5pre'
    pod 'MagicalRecord', '~> 2.0.7’
    pod 'SSKeychain', '~> 0.1.4’
    pod 'TestFlightSDK', '~> 1.1'
    pod 'SMCalloutView', '~> 1.1.2'
    !
    target :UnitTests do
    link_with 'UnitTests'
    pod 'OCMock', '~> 2.0.1'
    pod 'OCHamcrest', '~> 1.9'
    end

    View Slide

  79. IMHO

    View Slide

  80. Objective-C is not really hard to
    learn…

    View Slide

  81. the actual difficult part in iOS app
    development is Cocoa Framework

    View Slide

  82. Objective-C would be almost
    useless without Cocoa Framework

    View Slide

  83. Ruby without Rails?!

    View Slide

  84. design patterns
    observer
    singleton
    delegation
    command
    target-action
    composite
    notifications
    proxy
    MVC

    View Slide

  85. C

    View Slide

  86. what else..

    View Slide

  87. photoed by JD Hancock

    View Slide

  88. View Slide

  89. reference: http://goo.gl/2mzyMY
    Flash Display Hierarchy

    View Slide

  90. reference: http://goo.gl/xhS7m7
    UIKit and AppKit framework Hierarchy

    View Slide

  91. Views
    reference: http://goo.gl/xhS7m7

    View Slide

  92. reference: http://goo.gl/xhS7m7
    Views

    View Slide

  93. and I read Ruby source code..

    View Slide

  94. my iOS app dev experience
    = Ruby + C + Flash/AS3
    = +

    View Slide

  95. ⾼高⾒見⻯⿓龍
    Contacts
    photo by Eddie
    Website
    Blog
    Plurk
    Facebook
    Google Plus
    Twitter
    Email
    Mobile
    http://www.eddie.com.tw
    http://blog.eddie.com.tw
    http://www.plurk.com/aquarianboy
    http://www.facebook.com/eddiekao
    http://www.eddie.com.tw/+
    https://twitter.com/#!/eddiekao
    [email protected]
    +886-928-617-687

    View Slide