Objc under the_hood_2013

  • 798 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
798
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
15
Comments
0
Likes
5

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Objective-C - Under the hoodMichael Pan13年5月21⽇日星期⼆二
  • 2. Outline• Pointer & Object• C Struct for class• Dynamic feature13年5月21⽇日星期⼆二
  • 3. ContactsE-mail : scentsome@gmail.comFacebook Group : Developer’s Lessonhttp://www.facebook.com/groups/developerslessonFacebook Page : Developer’s Notehttp://www.facebook.com/pages/Taipei-Taiwan/Developers-note/226724001803Blogger : Developer’s Notehttp://iosdevelopersnote.blogspot.com/13年5月21⽇日星期⼆二
  • 4. BookObjective-C 與 iOS 開發⼊入⾨門http://www.books.com.tw/exep/prod/booksfile.php?item=001051791213年5月21⽇日星期⼆二
  • 5. Pointer & Object13年5月21⽇日星期⼆二
  • 6. Lets go from C0x010x050x0913年5月21⽇日星期⼆二
  • 7. Lets go from Cint a;0x010x050x0913年5月21⽇日星期⼆二
  • 8. Lets go from Cint a;a 0x010x050x0913年5月21⽇日星期⼆二
  • 9. Lets go from Cint a;aa=5;0x010x050x0913年5月21⽇日星期⼆二
  • 10. Lets go from Cint a;aa=5;50x010x050x0913年5月21⽇日星期⼆二
  • 11. Pointerint a;a=5;a 50x010x090x05& => address of13年5月21⽇日星期⼆二
  • 12. Pointerint a;a=5;int * pa;a 50x010x090x05& => address of13年5月21⽇日星期⼆二
  • 13. Pointerint a;a=5;int * pa;paa 50x010x090x05& => address of13年5月21⽇日星期⼆二
  • 14. Pointerint a;a=5;int * pa;paa 50x010x090x05pa = &a;& => address of13年5月21⽇日星期⼆二
  • 15. Pointerint a;a=5;int * pa;paa 50x010x090x05pa = &a;0x01& => address of13年5月21⽇日星期⼆二
  • 16. Pointer - Moreint a;a=5;int * pa;paa 50x010x090x05pa = &a;0x01printf(“%d”,*pa);13年5月21⽇日星期⼆二
  • 17. Recap - pointerWrite some thing13年5月21⽇日星期⼆二
  • 18. Pointer - Moreint a;a=5;int * pa;paa 50x010x090x05pa = &a;0x0113年5月21⽇日星期⼆二
  • 19. Pointer - Moreint a;a=5;int * pa;paa 50x010x090x05pa = &a;0x01*pa = 1013年5月21⽇日星期⼆二
  • 20. Pointer - Moreint a;a=5;int * pa;paa 50x010x090x05pa = &a;0x01*pa = 10printf(“%d”,a);13年5月21⽇日星期⼆二
  • 21. Pointer - Moreint a;a=5;int * pa;paa 0x010x090x05pa = &a;0x01*pa = 10printf(“%d”,a);1013年5月21⽇日星期⼆二
  • 22. Struct• More complicated typestruct Date {int day;int month;int year;};struct Date date = {3,10,1970};printf("The day is %d, %d/%d", date.year, date.day, date.month);13年5月21⽇日星期⼆二
  • 23. Struct - Memory0x10datestruct Date {int day;int month;int year;};13年5月21⽇日星期⼆二
  • 24. Struct - Memory0x10datestruct Date date ;struct Date {int day;int month;int year;};13年5月21⽇日星期⼆二
  • 25. Struct - Memory0x10datestruct Date date ;struct Date {int day;int month;int year;};13年5月21⽇日星期⼆二
  • 26. Struct - Memory0x10datestruct Date date ;date = {3,10,1970};struct Date {int day;int month;int year;};13年5月21⽇日星期⼆二
  • 27. Struct - Memory0x10datestruct Date date ;date = {3,10,1970};struct Date {int day;int month;int year;};310197013年5月21⽇日星期⼆二
  • 28. Function• we know main function• make another function13年5月21⽇日星期⼆二
  • 29. Function - Memoryint add(int a, int b){int result = a+b;return result;}addresultin Stack13年5月21⽇日星期⼆二
  • 30. • Text Segment - 唯讀執⾏行區• Data Segment - 可讀寫區包含 global 變數• Heap - 可依程式需要產⽣生和消除記憶體(動態配置- malloc)• Stack - 為了 function 產⽣生,可變動⼤大⼩小,包含區域變數Objective-C 程式記憶體配置Text SegmentData SegmentHeapStack未使⽤用記憶體位置增加Stack Pointer13年5月21⽇日星期⼆二
  • 31. Stack 與 FunctionText SegmentData SegmentHeapStackStack Pointerint main (int argc, const char * argv[]) {// ... 省略!}13年5月21⽇日星期⼆二
  • 32. Stack 與 FunctionText SegmentData SegmentHeapStackStack Pointerint main (int argc, const char * argv[]) {// ... 省略!}int sum = add(5, 6);13年5月21⽇日星期⼆二
  • 33. Stack 與 FunctionText SegmentData SegmentHeapStackStack Pointerint main (int argc, const char * argv[]) {// ... 省略!}int sum = add(5, 6);13年5月21⽇日星期⼆二
  • 34. Stack 與 FunctionText SegmentData SegmentHeapStackStack Pointerint main (int argc, const char * argv[]) {// ... 省略!}int sum = add(5, 6);13年5月21⽇日星期⼆二
  • 35. Stack 與 FunctionText SegmentData SegmentHeapStackStack Pointerint main (int argc, const char * argv[]) {// ... 省略!}int sum = add(5, 6);// 下⼀一⾏行程式碼13年5月21⽇日星期⼆二
  • 36. Stack 與 FunctionText SegmentData SegmentHeapStackStack Pointerint main (int argc, const char * argv[]) {// ... 省略!}int sum = add(5, 6);// 下⼀一⾏行程式碼13年5月21⽇日星期⼆二
  • 37. Stack 與 FunctionText SegmentData SegmentHeapStackStack Pointerint main (int argc, const char * argv[]) {// ... 省略!}int sum = add(5, 6);// 下⼀一⾏行程式碼13年5月21⽇日星期⼆二
  • 38. Stack 與 HeapText SegmentData SegmentHeapStack local variablemalloc13年5月21⽇日星期⼆二
  • 39. Pointer - 動態配置記憶體int * p_a;p_a = malloc(sizeof(int));*p_a = 8;printf("value in pointer a is %dn", *p_a);#include <stdlib.h>p_aHeap8Stack0xA00xA013年5月21⽇日星期⼆二
  • 40. Static variable• in Data SegmentText SegmentHeapStack未使⽤用Data Segmentint callStaticValue();int main (int argc, const char * argv[]) {callStaticValue();callStaticValue();printf("static variable is %d", callStaticValue());return 0;}int callStaticValue(){! static int sVar=0; // static 變數初始化只會做⼀一次! return sVar++; // ⼀一直加1}13年5月21⽇日星期⼆二
  • 41. Struct + function• it is what we call Objectstruct Date {int day;int month;int year;void (*formatedDate)( struct Date date);};void formatedFunction(struct Date date){printf("The day is %d, %d/%d",date.year, date.month, date.day );}// in main()struct Date today = {29, 4, 2013};today.formatedDate = formatedFunction;today.formatedDate(today);13年5月21⽇日星期⼆二
  • 42. Objective-C class - C struct• /usr/include/objc/objc.htypedef struct objc_class *Class;typedef struct objc_object {Class isa;} *id;typedef struct objc_selector !*SEL;typedef id (*IMP)(id, SEL, ...);13年5月21⽇日星期⼆二
  • 43. SELstruct objc_selector{void *sel_id;const char *sel_types;};13年5月21⽇日星期⼆二
  • 44. Objective-C class - C struct• /usr/include/objc/runtime.hstruct objc_class {Class isa;#if !__OBJC2__Class super_class OBJC2_UNAVAILABLE;const char *name OBJC2_UNAVAILABLE;long version OBJC2_UNAVAILABLE;long info OBJC2_UNAVAILABLE;long instance_size OBJC2_UNAVAILABLE;struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;struct objc_method_list **methodLists OBJC2_UNAVAILABLE;/* ignore */#endif} OBJC2_UNAVAILABLE;/* Use `Class` instead of `struct objc_class *` *//* ignore */typedef struct {const char *name;const char *value;} objc_property_attribute_t;13年5月21⽇日星期⼆二
  • 45. Methodstruct objc_method {SEL method_name OBJC2_UNAVAILABLE;char *method_types OBJC2_UNAVAILABLE;IMP method_imp OBJC2_UNAVAILABLE;} OBJC2_UNAVAILABLE;struct objc_method_list {struct objc_method_list *obsolete OBJC2_UNAVAILABLE;int method_count OBJC2_UNAVAILABLE;#ifdef __LP64__int space OBJC2_UNAVAILABLE;#endif/* variable length structure */struct objc_method method_list[1] OBJC2_UNAVAILABLE;} OBJC2_UNAVAILABLE;13年5月21⽇日星期⼆二
  • 46. About Message• Add method runtime13年5月21⽇日星期⼆二
  • 47. Add method runtimestruct objc_method {  SEL method_name;  char *method_types;  IMP method_imp;};struct objc_method_list {  struct objc_method_list *obsolete;  int method_count;  struct objc_method method_list[1];};13年5月21⽇日星期⼆二
  • 48. Add method#import <objc/objc-class.h>// create a class with no methods@interface EmptyClass : NSObject { }@end@implementation EmptyClass@end// define the function to add as a methodid sayHello ( id self, SEL _cmd,... ){  NSLog (@"Hello");}void addMethod (){  // create the method  struct objc_method myMethod;  myMethod.method_name = sel_registerName("sayHello");  myMethod.method_imp  = sayHello;    // build the method list.  // this memory needs to stick around as long as the  // methods belong to the class.  struct objc_method_list * myMethodList;  myMethodList = malloc (sizeof(struct objc_method_list));  myMethodList->method_count = 1;  myMethodList->method_list[0] = myMethod;    // add method to the class  class_addMethods ( [EmptyClass class], myMethodList );    // try it out  EmptyClass * instance = [[EmptyClass alloc] init];  [instance sayHello];  [instance release];}13年5月21⽇日星期⼆二
  • 49. Method under the hoodMyClass * aObj;int para = 5;[aObj setCount:para];objc_msgSend( aObj, @selector( setCount: ), para );selector functionsetCount: ...count ...經由 isa 找到 Classstructure從table 找到相對應的 function13年5月21⽇日星期⼆二
  • 50. Demo• DemoNCCU13 - MyCObject13年5月21⽇日星期⼆二
  • 51. Dynamic feature• Dot operation• KVC13年5月21⽇日星期⼆二
  • 52. Convenient Way- Since Objective-C 2.0- Dot Syntax- CascadeNSString *name = person.name;// name = [person name]person.name = @”Michael”;// [person setName:@”Michael”]person.bill.name = @”Andy”;// [[person bill] setName:@”Andy”]person.bill.name ;// [[person bill] name]13年5月21⽇日星期⼆二
  • 53. Property means method@interface Person : NSObject@property int age;@property (strong) NSString * name;@end@implementation Person@endPerson * person = [[Person alloc] init];person.name = @”Michael”;person.age = 35;13年5月21⽇日星期⼆二
  • 54. Key-Value Coding13年5月21⽇日星期⼆二
  • 55. Another access method• Read• person.name;• [person name];• [person valueForKey:@”name”];• Write• person.name = @”michael”;• [person setName:@”michael”];• [person setValue:@”michael” forKey:@”name”];13年5月21⽇日星期⼆二
  • 56. • Find the action -name or -setName• Find real variable _name and then nameFinding ruleforKey:@”name”13年5月21⽇日星期⼆二
  • 57. • attribute• scalar // auto-boxing for KVC• NSString• Boolean• Immutable object : NSColor, NSNumber• to-many relationship - objects in NSArray, NSSetAccessible Types13年5月21⽇日星期⼆二
  • 58. Recap@interface MyObject : NSObject {! NSString * name;! NSString * _name;}@property (retain, readonly) NSString * _name;@property (retain, readonly) NSString * name;@endMyObject * myo = [MyObject new];[myo setValue:@"michael" forKey:@"name"];NSLog(@" kvc %@",[myo valueForKey:@"name"]);Result : kvc (null) ? 0. no setter1. find out _name = @”michael”2. find out name’s getter, return name@implementation MyObject@synthesize name, _name;@end下底線開頭的變數要⼩小⼼心使⽤用13年5月21⽇日星期⼆二
  • 59. [myCar valueForKeyPath: @"engine.vendor"]KeyPath@interface MyCar : NSObject {! Engine * engine;}@end@interface Engine : NSObject {! NSString * vendor;}@end13年5月21⽇日星期⼆二
  • 60. NSNumber * count;count = [myCars valueForKeyPath: @"@avg.price"]Array Operation@interface MyCar : NSObject {! int price;}@end@sum.xxx@min.xxx@max.xxxmyCar1 myCar2 myCar3myCars =13年5月21⽇日星期⼆二
  • 61. Recap// 計算 engines array裡平均的priceNSArray * engines = [???:myengine1, myengine2, myengine3, nil];NSLog(@" average price is %@",[engines valueForKeyPath:@"???"]);@interface Engine : NSObject {! int price;}@end13年5月21⽇日星期⼆二
  • 62. nil for scalar value ?[engine setValue: nil forKey:@”price”]error !!- (void) setNilValueForKey: (NSString *) key {if ([key isEqualToString: @"price"]) {price = 0;} else {[super setNilValueForKey: key];}}overwrite -setNilValueForKey:13年5月21⽇日星期⼆二
  • 63. Handle UndefinedKey- (void) setValue: (id) value forUndefinedKey: (NSString *) key {// do something}- (id) valueForUndefinedKey:(NSString *)key {// do something}13年5月21⽇日星期⼆二
  • 64. Recap實作- (void) setValue: (id) value forUndefinedKey: (NSString *) key;- (id) valueForUndefinedKey:(NSString *)key;13年5月21⽇日星期⼆二
  • 65. ReferenceIntroduction to Key-Value Coding Programming Guidehttp://goo.gl/rrfmy13年5月21⽇日星期⼆二
  • 66. 實例 - 解析 RSS網路上免費資源 - 多⽤用來呈現新聞13年5月21⽇日星期⼆二
  • 67. With XML - RSS-like<car><item><price> 99 </price><year> 1922 </year></item><item><price> 30 </price><year> 1990 </year></item><item><price> 82 </price><year> 1980 </year></item><item><price> 75 </price><year> 1920 </year></item><item><price> 60 </price><year> 1910 </year></item></car>ArrayDictionarykey valueprice 99year 192213年5月21⽇日星期⼆二
  • 68. Array and KVC<car><item><price> 99 </price><year> 1922 </year></item><item><price> 30 </price><year> 1990 </year></item><item><price> 82 </price><year> 1980 </year></item><item><price> 75 </price><year> 1920 </year></item><item><price> 60 </price><year> 1910 </year></item></car>ArrayDictionary[array valueForKey:@”price”](99,30,82,75,60,)13年5月21⽇日星期⼆二
  • 69. DemoValueAndPredicate13年5月21⽇日星期⼆二
  • 70. Question13年5月21⽇日星期⼆二