黑马程序员技术交流社区

标题: 自己的OC学习笔记01,类的声明实现与对象创建,方法声明... [打印本页]

作者: wowthe1st    时间: 2015-7-27 13:27
标题: 自己的OC学习笔记01,类的声明实现与对象创建,方法声明...
适合有java基础的同学迅速了解OC,个人喜好用代码来记笔记,看起来直观形象;
类的声明实现与对象创建,方法声明实现与调用及传参

  1. typedef enum{
  2.         ColorBlack='B',ColorWhite='w',ColorRed='r',
  3.         ColorBlue='b',ColorGreen='g',ColorYellow='y'
  4. } Color;
  5. typedef struct{
  6.         int year,month,day;
  7. } Date;

  8. #import <Foundation/Foundation.h>
  9. //OC基本库Foundation主头文件


  10. @interface Autobot :NSObject   //类的声明,继承NSObject类,使当前类拥有父类的一些方法与属性(比如创建与销毁的方法)
  11. {        //member variable必须写在{}中,类创建对象后,
  12.         //这些member variables默认初始化为0,不能在interface中手动给他们赋初值
  13.         //OC中类的member variable都是在interface中声明
  14.         @public  //public 后的所有instance variable都是公共的
  15.         int wheels        ,speed;       
  16.         char *name;
  17.         Color color;
  18.         Date date;//member variable可以使任何数据类型,包括其他OC类
  19.        
  20. }

  21. //方法声明,OC中method写法,+开头为类方法,-打头为对象方法,类方法可以与对象方法同名
  22. //OC类中方法传参方式,OC中一个方法参数对应一个:号,数据类型使用()括起来,此种方法书写方式利于代码阅读
  23. + (NSString*)getDialogue;
  24. + (void)declare;
  25. - (void) initWithWheels:(int)wheels speed:(int)speed name:(char*)name color:(Color)color date:(Date*)date;
  26. - (void) transform;
  27. - (void)introduce;
  28. - (void)speedUp:(int)moreSpeed;
  29. - (int)compareSpeedWith:(Autobot*)anotherAutobot;//参数为OC类时必须使用指针类型,OC类只能使用指针变量来操作
  30. @end

  31. @implementation Autobot   //类的实现
  32. //方法的实现必须放在实现类中

  33. + (NSString*)getDialogue
  34. {
  35.         return @"I AM AUTOBOT";
  36. }
  37. + (void)declare
  38. {
  39.         //类方法中self指向调用该方法的类对象,这里等同于[Autobot getDialogue]
  40.         NSLog([self getDialogue]);
  41. }
  42. - (void) initWithWheels:(int)wheels speed:(int)speed name:(char*)name color:(Color)color date:(Date*)date
  43. {
  44.         //初始化方法,方法参数名或局部变量名与成员变量名一样时,使用成员变量时必须使用self指向
  45.         self->wheels=wheels,self->speed=speed,self->name=name,self->color=color,self->date=*date;
  46. }

  47. - (void) transform  
  48. {       
  49.         NSLog(@"Autobot %s transform",self->name);//OC字符串必须以@开头       
  50.         //隐藏指针变量self指向当前调用该方法的类的实例
  51. }
  52. - (void) introduce
  53. {
  54.        
  55.         NSLog(@"Autobot %s has %d wheels and speed is %d km/h,color is %c,made in %d-%d-%d",
  56.         name,self->wheels,speed,color,date.year,date.month,date.day);
  57.         //self可省略不写,默认调用的是self指向的对象的成员变量
  58. }
  59. - (void) speedUp:(int)moreSpeed
  60. {
  61.         speed+=moreSpeed;
  62. }
  63. - (int)compareSpeedWith:(Autobot*)anotherAutobot
  64. {
  65.         int delta=self->speed-anotherAutobot->speed;
  66.         char *p;
  67.         delta>=0?(p="faster"):(p="slower");
  68.         NSLog(@"%s is %dkm/h %s than %s",name,abs(delta),
  69.         p,anotherAutobot->name);
  70.         return delta;
  71. }
  72. @end

  73. int main (int argc, const char *argv[])
  74. {       
  75.     //OC中执行行为必须加[],格式为[行为执行者 行为名称]
  76.     //OC中创建对象方式[类名 new],返回该对象内存中的指针
  77.     Autobot *p= [Autobot new];
  78.     //利用对象指针变量给对象成员变量赋值
  79.     p->wheels=8,p->speed=180,p->name="Optimus Prime",p->color=ColorBlue;
  80.     Date date1={2008,10,3};p->date=date1;
  81.    
  82.     Autobot *p2=[Autobot new];
  83.     Date date2={2010,1,5};
  84.     //利用对象的初始化method给对象成员变量赋值
  85.     [p2 initWithWheels:4 speed:150 name:"Bumble Bee"
  86.     color:ColorYellow date:&date2];
  87.        
  88.          
  89.         //利用对象指针变量调用对象方法
  90.         //意为给p所指向的对象发送一条introduce消息
  91.    [Autobot declare];//类方法需要通过类名调用
  92.    [p introduce],[p2 introduce];
  93.    [p transform],[p2 transform];
  94.    int delta=[p compareSpeedWith:p2];
  95.    [p2 speedUp:50];
  96.    delta=[p compareSpeedWith:p2];
  97.    
  98.   /*该消息机制具体执行过程:
  99.   *1>向 p所指向的对象发送一条introduce消息
  100.   *2>对象接收到消息后,调用指针变量isa所指向的类对象的introduce方法,
  101.   *   并将对象自身指针以隐藏        参数的方式传给该方法的隐藏形参self
  102.   *   注: 每个继承了NSObject类的对象实例中都带有一个指针变量isa,
  103.   *                        指向该对象的类加载后在内存中的位置;
  104.   *                        类加载只加载一份,加载了类中实现的方法(包括类方法与对象方法);
  105.   *3>被调用的方法中根据指针变量self使用其所指向的对象的成员变量和对象方法;
  106.   */
  107.    
  108.    
  109.    /* 类方法与对象方法异同点:
  110.    *同>都是在类加载时被加载进内存,只加载一份,
  111.    *        调用对象方法和类方法时,都会隐藏传递一个self指针变量指向
  112.    *        当前调用方法的对象或类对象(与java中this不同,this只有调用对象方法时才会隐式传递)
  113.    *异>类方法只能由类对象调用,self指向调用它的类对象,
  114.    *         对象方法只能由对象的指针调用,self指向调用它的对象,
  115.    *         对象方法可以访问对象的成员变量,类方法不行;
  116.    */
  117.    
  118.         return 0;
  119. }
复制代码









欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2