黑马程序员技术交流社区

标题: oc中对象的初始化实例解析 [打印本页]

作者: fellerlong    时间: 2015-10-12 17:46
标题: oc中对象的初始化实例解析
  下面就以现实中轮胎举例,必须考虑轮胎的压力及台面花纹深度等,如下:
    1) Tire类的定义部分Tire.h文件:
       #import <Cocoa/Cocoa.h>
       @interface Tire:NSObject
        {
        Float pressure;
        Float treadDepth;
        }
       -(id) initWithPressure: (float) pressure;   //便利初始化函数的使用
       -(id) initWithTreadDepth: (float) treadDepth;
       -(id) initWithPressure: (float) pressure treadDepth: (float) treadDepth;
      //选最长包含最多的便利初始化函数作为指定初始化函数,这个函数
      可以作为指定初始化函数;
       -(void) setPressure: (float) pressure;
       -(float) pressure;
       -(void) setTreadDepth: (float) treadDepth;
       -(float) treadDepth;
       @end//Tire
    2) Tire类的实现部分Tire.m文件:
       #import “Tire.h”
       @implementation Tire
       -(id) init
        {
        If(self=[self initWithPressure: 34 treadDepth: 20])
         {}
        Return (self);
        }//init
       -(id) initWithPressure: (float) p
        {
         f(self=[self initWithPressure: p treadDepth: 20.0])
          {}
         Return (self);
        }//initWithPressure
       -(id) initWithTreadDepth: (float) td
        {
         If(self=[self initWithPressure: 34 treadDepth: td])
          { }
         Return (self);
        }//initWithTreadDepth
//下面是指定初始化函数,其它所有初始化函数都是以指定初始化函数执行的初始化操作,在指定初始化函数中必须使用super调用超类的指定初始化函数。
       -(id) initWithPressure: (float) p treadDepth: (float) td
        {
         If(self=[super init])
          { pressure=p;
           treadDepth=td;
          }
         Return (self);
        }//initWithPressure:treadDepth:
       -(void) setPressure: (float) p
        { pressure=p; }//setPressure
       -(float) pressure
        { return (pressure); }//pressure
       -(void) setTreadDepth: (float) td
        { treadDepth=td; }//setTreadDepth
       -(float) treadDepth
         { return (treadDepth); }//treadDepth
-(NSString*) description
{
   NSString * desc=[NSString stringWithFormat:@”Tire: Pressure: %.1f
            TreadDepth: %.1f”,pressure,treadDepth];
   Return (desc);
}//descrption
@end//Tire
       3) engine类的定义部分Engine.h文件:
            #import <Cocoa/Cocoa.h>
            @interface Engine:NSObject
            @end//Engine
       4) engine类的实现部分Engine.m文件:
            #import “Engine.h”
            @implementation Engine
            -(NSString *) description
             {
              Return (@”I am an engine. Vroom!”);
             }//description
             @end//Engine
       5) Car类的定义部分Car.h文件:
            #import <Cocoa/Cocoa.h>
            @class Tire;
            @class Engine;
            @interface Car:NSObject
            {  
Engine * engine;
NSMutableArray *tires;
}
-(void) setEngine: (Engine *) newEngine;
-(Engine *) engine;
            -(void) setTire: (Tire*) tire atIndex: (int) index;
            -(Tire *) tireAtIndex: (int) index;
            -(void) print;
            @end//Car
       6) Car类的实现部分Car.m文件:
            #import “Car.h”
            @implementation Car
            -(id) init
            {
              If(self=[super init])
               {
                  tires = [[NSMutableArray alloc] init];
                  for(int i=0;i<4;i++)
                   {
                     [tires addObject: [NSNull null]; //用NSNull类的对象来作
                                     为一个展位符。
                   }
                }
             Return (self);
            }//init
//类的设置方法中如果有oc对象的使用,则需要在设置方法中进行内存管理。内存管理遵循先保存再释放最后传递的原则,以此来进行设置方法中对象的内存管理保证在新对象传递前释放掉原先的对象。如下:
            -(void) setEngine: (Engine*) newEngine
            {
             [newEngine retain];
             [engine release];
             engine =newEngine;
            }//setEngine
            -(Engine*) engine
            {
             Return (engine);
            }//engine
注意:方法中的内存管理只在使用了oc对象实例变量的时候使用,如setter方法。而getter方法仅仅是简单地返回当前的对象不需要使用内存管理。
//setTire设置方法中因为NSMutableArray数组是集合类会自动保留新的tire对象并释放索引位置上的对象,所以对于tire对象不需要执行其它内存管理。当NSMutableArray数组被销毁时,它将释放数组中的所有对象,因此tire对象被清除。
            -(void) setTire: (Tire*) tire atIndex: (int) index
            {
              [tires replaceObjectAtIndex: index withObject: tire];
            }//setTire:atIndex:
            -(Tire *) tireAtIndex: (int) index
            {
             Tire *tire =[tires objectAtIndex: index];
             Return (tire);
            }//tireAtIndex:
           //在有oc对象的实例变量类中必须定义dealloc方法,在类的对象使用完后程序会自动调用dealloc方法释放掉类的对象所占的资源,如下:
            -(void) dealloc
            {
             [tires release];
             [engine release];
             [super dealloc];
            }//dealloc
            -(void) print
            {
            For(int i=0;i<4;i++)
              {
                NSLog(@”%@”,[self tireAtIndex: i]);
              }
            NSLog(@”%@”,engine);
            }//print
        7) Main函数体main.m文件:
            #import “Tire.h”
            #import “Engine.h”
            #import “Car.h”
            int main(int argc,const char argv[])
            {
             @autoreleasepool
              {
               Car *car = [[Car alloc] init];
               for (int i=0;i<4;i++)
                 {
                   Tire *tire=[[Tire alloc] init];
                   [tire setPressure:23+i];
                   [tire setTreadDepth:33-i];
                   [Car setTire: tire atIndex: i];
                   [tire release];
                 }
               Engine *engine = [[Engine alloc] init];
               [car setEngine: engine];
               [car print];
               [car release];
              }
              Return (0);
              }//main
在main函数中为car创建了四个轮子和一个发动机,并且每个轮子都有自己的压力和花纹深度。通过print方法将它们以字符串的形式表示出来。
例子中我们讨论了便捷初始化函数、指定初始化函数,同时也分析了oc对象在设置方法中的内存管理,还了解了集合类对象在使用中对内存管理的处理。

作者: L503254118    时间: 2015-10-14 08:00
学习了,赞一个,加油




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