读书人

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

发布时间: 2012-06-20 20:37:21 作者: rapoo

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

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

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

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

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

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,输出结果与之前一样

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

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

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

读书人网 >移动开发

热点推荐