Objc under the_hood_2013

1,261 views

Published on

0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,261
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
19
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Objc under the_hood_2013

  1. 1. Objective-C - Under the hoodMichael Pan13年5月21⽇日星期⼆二
  2. 2. Outline• Pointer & Object• C Struct for class• Dynamic feature13年5月21⽇日星期⼆二
  3. 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. 4. BookObjective-C 與 iOS 開發⼊入⾨門http://www.books.com.tw/exep/prod/booksfile.php?item=001051791213年5月21⽇日星期⼆二
  5. 5. Pointer & Object13年5月21⽇日星期⼆二
  6. 6. Lets go from C0x010x050x0913年5月21⽇日星期⼆二
  7. 7. Lets go from Cint a;0x010x050x0913年5月21⽇日星期⼆二
  8. 8. Lets go from Cint a;a 0x010x050x0913年5月21⽇日星期⼆二
  9. 9. Lets go from Cint a;aa=5;0x010x050x0913年5月21⽇日星期⼆二
  10. 10. Lets go from Cint a;aa=5;50x010x050x0913年5月21⽇日星期⼆二
  11. 11. Pointerint a;a=5;a 50x010x090x05& => address of13年5月21⽇日星期⼆二
  12. 12. Pointerint a;a=5;int * pa;a 50x010x090x05& => address of13年5月21⽇日星期⼆二
  13. 13. Pointerint a;a=5;int * pa;paa 50x010x090x05& => address of13年5月21⽇日星期⼆二
  14. 14. Pointerint a;a=5;int * pa;paa 50x010x090x05pa = &a;& => address of13年5月21⽇日星期⼆二
  15. 15. Pointerint a;a=5;int * pa;paa 50x010x090x05pa = &a;0x01& => address of13年5月21⽇日星期⼆二
  16. 16. Pointer - Moreint a;a=5;int * pa;paa 50x010x090x05pa = &a;0x01printf(“%d”,*pa);13年5月21⽇日星期⼆二
  17. 17. Recap - pointerWrite some thing13年5月21⽇日星期⼆二
  18. 18. Pointer - Moreint a;a=5;int * pa;paa 50x010x090x05pa = &a;0x0113年5月21⽇日星期⼆二
  19. 19. Pointer - Moreint a;a=5;int * pa;paa 50x010x090x05pa = &a;0x01*pa = 1013年5月21⽇日星期⼆二
  20. 20. Pointer - Moreint a;a=5;int * pa;paa 50x010x090x05pa = &a;0x01*pa = 10printf(“%d”,a);13年5月21⽇日星期⼆二
  21. 21. Pointer - Moreint a;a=5;int * pa;paa 0x010x090x05pa = &a;0x01*pa = 10printf(“%d”,a);1013年5月21⽇日星期⼆二
  22. 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. 23. Struct - Memory0x10datestruct Date {int day;int month;int year;};13年5月21⽇日星期⼆二
  24. 24. Struct - Memory0x10datestruct Date date ;struct Date {int day;int month;int year;};13年5月21⽇日星期⼆二
  25. 25. Struct - Memory0x10datestruct Date date ;struct Date {int day;int month;int year;};13年5月21⽇日星期⼆二
  26. 26. Struct - Memory0x10datestruct Date date ;date = {3,10,1970};struct Date {int day;int month;int year;};13年5月21⽇日星期⼆二
  27. 27. Struct - Memory0x10datestruct Date date ;date = {3,10,1970};struct Date {int day;int month;int year;};310197013年5月21⽇日星期⼆二
  28. 28. Function• we know main function• make another function13年5月21⽇日星期⼆二
  29. 29. Function - Memoryint add(int a, int b){int result = a+b;return result;}addresultin Stack13年5月21⽇日星期⼆二
  30. 30. • Text Segment - 唯讀執⾏行區• Data Segment - 可讀寫區包含 global 變數• Heap - 可依程式需要產⽣生和消除記憶體(動態配置- malloc)• Stack - 為了 function 產⽣生,可變動⼤大⼩小,包含區域變數Objective-C 程式記憶體配置Text SegmentData SegmentHeapStack未使⽤用記憶體位置增加Stack Pointer13年5月21⽇日星期⼆二
  31. 31. Stack 與 FunctionText SegmentData SegmentHeapStackStack Pointerint main (int argc, const char * argv[]) {// ... 省略!}13年5月21⽇日星期⼆二
  32. 32. Stack 與 FunctionText SegmentData SegmentHeapStackStack Pointerint main (int argc, const char * argv[]) {// ... 省略!}int sum = add(5, 6);13年5月21⽇日星期⼆二
  33. 33. Stack 與 FunctionText SegmentData SegmentHeapStackStack Pointerint main (int argc, const char * argv[]) {// ... 省略!}int sum = add(5, 6);13年5月21⽇日星期⼆二
  34. 34. Stack 與 FunctionText SegmentData SegmentHeapStackStack Pointerint main (int argc, const char * argv[]) {// ... 省略!}int sum = add(5, 6);13年5月21⽇日星期⼆二
  35. 35. Stack 與 FunctionText SegmentData SegmentHeapStackStack Pointerint main (int argc, const char * argv[]) {// ... 省略!}int sum = add(5, 6);// 下⼀一⾏行程式碼13年5月21⽇日星期⼆二
  36. 36. Stack 與 FunctionText SegmentData SegmentHeapStackStack Pointerint main (int argc, const char * argv[]) {// ... 省略!}int sum = add(5, 6);// 下⼀一⾏行程式碼13年5月21⽇日星期⼆二
  37. 37. Stack 與 FunctionText SegmentData SegmentHeapStackStack Pointerint main (int argc, const char * argv[]) {// ... 省略!}int sum = add(5, 6);// 下⼀一⾏行程式碼13年5月21⽇日星期⼆二
  38. 38. Stack 與 HeapText SegmentData SegmentHeapStack local variablemalloc13年5月21⽇日星期⼆二
  39. 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. 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. 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. 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. 43. SELstruct objc_selector{void *sel_id;const char *sel_types;};13年5月21⽇日星期⼆二
  44. 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. 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. 46. About Message• Add method runtime13年5月21⽇日星期⼆二
  47. 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. 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. 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. 50. Demo• DemoNCCU13 - MyCObject13年5月21⽇日星期⼆二
  51. 51. Dynamic feature• Dot operation• KVC13年5月21⽇日星期⼆二
  52. 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. 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. 54. Key-Value Coding13年5月21⽇日星期⼆二
  55. 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. 56. • Find the action -name or -setName• Find real variable _name and then nameFinding ruleforKey:@”name”13年5月21⽇日星期⼆二
  57. 57. • attribute• scalar // auto-boxing for KVC• NSString• Boolean• Immutable object : NSColor, NSNumber• to-many relationship - objects in NSArray, NSSetAccessible Types13年5月21⽇日星期⼆二
  58. 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. 59. [myCar valueForKeyPath: @"engine.vendor"]KeyPath@interface MyCar : NSObject {! Engine * engine;}@end@interface Engine : NSObject {! NSString * vendor;}@end13年5月21⽇日星期⼆二
  60. 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. 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. 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. 63. Handle UndefinedKey- (void) setValue: (id) value forUndefinedKey: (NSString *) key {// do something}- (id) valueForUndefinedKey:(NSString *)key {// do something}13年5月21⽇日星期⼆二
  64. 64. Recap實作- (void) setValue: (id) value forUndefinedKey: (NSString *) key;- (id) valueForUndefinedKey:(NSString *)key;13年5月21⽇日星期⼆二
  65. 65. ReferenceIntroduction to Key-Value Coding Programming Guidehttp://goo.gl/rrfmy13年5月21⽇日星期⼆二
  66. 66. 實例 - 解析 RSS網路上免費資源 - 多⽤用來呈現新聞13年5月21⽇日星期⼆二
  67. 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. 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. 69. DemoValueAndPredicate13年5月21⽇日星期⼆二
  70. 70. Question13年5月21⽇日星期⼆二

×