Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

from Ruby to Objective-C

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

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)

Slide 5

Slide 5 text

Ruby > Rails

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

100% Ruby Lover!

Slide 8

Slide 8 text

Rails Girls Taipei

Slide 9

Slide 9 text

Rails Girls Taipei

Slide 10

Slide 10 text

WebConf Taiwan 2014

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

I’m going to talk about..

Slide 13

Slide 13 text

what I learned in Ruby…

Slide 14

Slide 14 text

and move to Objective-C

Slide 15

Slide 15 text

after all, our life, time and resources are limited

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

what about Objective-C?

Slide 18

Slide 18 text

“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); }];

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

Introduction

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

they have the same ancestor

Slide 24

Slide 24 text

Smalltalk photo by Marcin Wichary

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

Ruby != Rails Objective-C != Cocoa Framework

Slide 27

Slide 27 text

they have something in common..

Slide 28

Slide 28 text

both Ruby and Objective-C are Object-Oriented

Slide 29

Slide 29 text

both Ruby and Objective-C are strongly typed language.

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

both Ruby and Objective-C are Dynamic Typing

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

id

Slide 36

Slide 36 text

Objective-C is superset of C

Slide 37

Slide 37 text

Objective-C is still C

Slide 38

Slide 38 text

NSString, NSArray, NSNumber…

Slide 39

Slide 39 text

NextSTEP

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

OOP

Slide 42

Slide 42 text

everything in Ruby is an object…

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

object model class Animal end ! class Dog < Animal end

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

method & message

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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];

Slide 57

Slide 57 text

block

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

block ^{ };

Slide 60

Slide 60 text

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?

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

iteration

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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);

Slide 65

Slide 65 text

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?

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

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)];

Slide 68

Slide 68 text

add methods at runtime

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

ecosystem

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

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'

Slide 78

Slide 78 text

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

Slide 79

Slide 79 text

IMHO

Slide 80

Slide 80 text

Objective-C is not really hard to learn…

Slide 81

Slide 81 text

the actual difficult part in iOS app development is Cocoa Framework

Slide 82

Slide 82 text

Objective-C would be almost useless without Cocoa Framework

Slide 83

Slide 83 text

Ruby without Rails?!

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

C

Slide 86

Slide 86 text

what else..

Slide 87

Slide 87 text

photoed by JD Hancock

Slide 88

Slide 88 text

No content

Slide 89

Slide 89 text

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

Slide 90

Slide 90 text

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

Slide 91

Slide 91 text

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

Slide 92

Slide 92 text

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

Slide 93

Slide 93 text

and I read Ruby source code..

Slide 94

Slide 94 text

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

Slide 95

Slide 95 text

⾼高⾒見⻯⿓龍 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