IOS之Objective-C学习札记(四)

IOS之Objective-C学习笔记(四)

       大家好~由于最近都比较忙,趁着现在周末更新一下我的Objective-C学习笔记,好,现在开始。

1.什么是复合?在Objective-C 中,复合是通过包含作为实例变量的对象指针实现的:(我们定义一辆车有一个发动机和四个轮,程序如下)

[plain] view plaincopy
  1.  #import<Foundation/Foundation.h>  
  2.   
  3. @interface  Tire : NSObject    
  4. @end//Tire接口    
  5. @implementation  Tire    
  6.  - (NSString *) description    
  7.  {    
  8.        return(@"I  am  a  tire, I  last  a  while");    
  9.  }//description的实现    
  10.  @end//Tire的实现   
  11.  
  12.  @interface  Engine  : NSObject    
  13.  @end//Engine接口    
  14.  @implementation  Engine    
  15.   - (NSString *) description    
  16.  {    
  17.        return(@"I am an engine. Vroom!");    
  18.  }    
  19.  @end//Engine的实现    

  20.  @interface Car : NSObject    
  21.  {    
  22.         Engine  *engine;    
  23.         Tire  *tires[ 4 ];    
  24.  }    
  25.  - (void) print;    
  26.  @end//Car接口    
  27.  @Implementation  Car    
  28.  - (id) init    
  29.   {    
  30.        if (self  = [super  init] ){    
  31.             engine  =  [ Engine  new ];    
  32.              tires[ 0 ] = [ Tire new ];    
  33.              tires[ 1 ] = [ Tire new ];    
  34.              tires[ 2 ] = [ Tire new ];    
  35.              tires[ 3 ] = [ Tire new ];    
  36.        }    
  37.        return(self);    
  38.   }//init方法实现    
  39.   -(void) print    
  40.    {    
  41.          NSLog (@"%@" , engine);    
  42.          NSLog (@"%@" , tires[0]);    
  43.          NSLog (@"%@" , tires[1]);    
  44.          NSLog (@"%@" , tires[2]);    
  45.          NSLog (@"%@" , tires[3]);    
  46.    }//print方法的实现    
  47.   @end//Car的实现    
  48.    int  main (int  argc, const  char * argv[ ])    
  49.   {    
  50.          Car  *car;    
  51.          car  = [ Car  new];    
  52.          [ car print ];    
  53.          return (0);    
  54.   }//main :运行结果为,I am an engine, Vrooml    
  55.                                            I am a tire , I last a  while.    
  56.                                            I am a tire , I last a  while.    
  57.                                            I am a tire , I last a  while.    
  58.                                            I am a tire , I last a  while.    
  59. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////    

2.下面我来详解看看这个程序要注意的一些地方:

          (1)自定义NSLog( ):从上面程序我们可以看到轮和发动机都有一个description方法,程序运行时是这样的:NSlog( )给当前对象发送描述消息(description),r

           然后对象的description方法生产一个NSString并返回,之后NSLog( )在其输出中包含这个字符串。在类中添加description方法就可以自定义NSLog( )如何输出对象

          (2)engine和tires实例变量是复合的,因为它们是Car的实例变量。每个Car对象都会为指向engine和tires的指针分配内存,但是真正包含在Car中的并不是engine

          和tires变量,而只是内存中存在的其他对象的引用。这些指针开始会被初始化为nil(零值)

          (3)来看看Car类做了些什么,第一步,为对象分配内存,即对象获得一个用来存放其实例变量的内存块,第二步,自动调用init方法,让对象处于可以状态。

          (4) if (self  = [super  init] )这句的具体含义在后面会说明。

3.存取方法:

        (1)什么是存取方法?它是来读取或改变对象特定属性的方法。一般分为,setter方法和getter方法。看看一下例子:

[plain] view plaincopy
  1. @interface  Car : NSObject  
  2.        {  
  3.                 Engine  *engine;  
  4.                 Tire  *tires[ 4 ];  
  5.        }  
  6.       -(Engine *) engine;  
  7.       -(void *) setEngine : (Engine *)newEngine;  
  8.       -(Tire *) tireAtindex : ( int ) index;  
  9.       -(void) setTire: (Tire *)tire  
  10.                   atIndex: (int) index;  
  11.       -(void) print;  
  12.      @ens//Car  
  13.      @implementation  Car  
  14.      -(Engine *) engine  
  15.       {  
  16.             return (engine);  
  17.      }//engine  
  18.      -(void )setEngine : (Engine *) newEngine  
  19.      {  
  20.            engine  =  newEngine;  
  21.      }//setEngine  
  22.      -(void) setTire  : (Tire *) tire  
  23.                  atindex  : (int) index  
  24.       {  
  25.             if(index < 0 || index > 3){  
  26.                    NSLog (@"bad index (%d) in setTire : atIndex : ", index);  
  27.                   exit (1);   
  28.             }  
  29.             tires[ index ] = tire;  
  30.       }//seTire : atIndex :  
  31.      -(Tire  *) tireAtIndex : (int) index   
  32.      {  
  33.                    if( index < 0 || index >3){  
  34.                            NSLog (@"bad  index  (%d)  in "tireAtIndex :" , index );  
  35.                            exit (1);  
  36.                    }  
  37.                   return (tires [ index ] );  
  38.       }//tireAtIndex :  
  39.     @end//Car的实现  
  40.    //////////////////////////////////////////////////////////////////////////////////////////////////////////  

          想实际使用这些存取方法,可以像下面这样写:Engine  *engine = [ Engine  new ] ;

                                                                                               [ car setEngine : engine ];

                                                                                               NSLog (@"the car Engine is %@" , [car engine]);

                                                                                               Tire *tire = [  Tire new ];

                                                                                               [car setTire : tire 

                                                                                                       atIndex : 2 ];

                                                                                               NSLog (@"tire number two is %@",[ car tireAtIndex : 2 ]);                   

4.以上程序需要注意的一些地方:

          (1)setter方法根据它所更改的属性的名称来命名,并加上前缀”set“,而getter方法则仅仅根据其返回的属性名称来命名前面不加”get“

          (2)在以上程序中可以看到:-(void) setTire  : (Tire *) tire  atindex : (int) index ,设置轮的方法,这方法这样写是什么意思呢?由于汽车的4个轮胎都有自己不同的位置,所以为汽车配置某个轮胎的时候,不仅要知道使用哪个轮胎,还要清楚每个轮在 汽车上的位置,同样,当访问汽车上某个轮胎时,也要指定这个轮的具体位置才行


5.添加了设置属性和获取属性等存储方法后对应的main()函数

[plain] view plaincopy
  1. int  main (int  argc,  const  char * argv[ ])  
  2.  {  
  3.        Car *car  =  [Car  new];  
  4.         Engine *engine = [Engine  new];  
  5.         [ car setEngine : engine ];  
  6.         int  i;  
  7.         for (i = 0 ; i <4 ; i++){  
  8.             Tire *tire = [ Tire new];  
  9.             [car  setTire : tire   
  10.                   atIndex  : i ];    
  11.          }  
  12.          [ car print ];  
  13.          return(0);  
  14.  }//main,输出结果与之前一样  
  15.    

6.另外我们还可以自定义两个类,分别继承Engine和Tire,并且可以对它的方法复写。具体怎么复合和继承配合使用这里就不多说了,比较简单~

7.判断是复合还是继承的方法很简单:当某件事物里有什么这是复合,当某事物是什么这是继承,用这个方法就能简单的把它们区分开来

        好了,这篇就在这里结束了~继续会有更新~~~转载请注明:http://blog.csdn.net/yuzhiboyi