现在的位置: 首页 > 综合 > 正文

1.类与对象之objective-c

2013年09月17日 ⁄ 综合 ⁄ 共 3177字 ⁄ 字号 评论关闭

1.ObjCC的区别与联系

  

首先 ObjC是一个面向对象的语言(封装、继承、多态)  ObjC相当于C的一个超集ObjC允许使用任何C语言代码但增加了许多C没有的特点  
bigger easier  

    

2.ObjC中的类与对象

    

    类由接口( XX.h    @interface)和实现(XX.m  @implementation)两部分构成

    XX.h中声明类中的实例变量和功能

    XX.m中实现.h中的功能

    

    注意:

    命名规则 类名首字母大写  Student  方法名首字母小写(驼峰)-voidsayHi

    -  实例方法     +  类方法

    

3.类的创建和使用

    

   1)声明:在.h文件中

    

    #import<Foundation/Foundation.h>

    

    @interface Student : NSObject//NSObject父类名 
Student
类名

    {

       实例变量int _age;    //实例变量分为@protect
@private @public默认@protect

        

    }

    

    - (void)setAge:(int)age //声明方法

    - (int)getAge

    - (void)sayHi

    @end

    

    

2)实现:在.m文件中

    

    #import"Student.h"  //要包含.h文件

    

   @implementation Student

    

    -(void)setAge:(int)age //方法的实现

    {

        int _age=age;

    }

    -(int)getAge

    {

        return _age;

    }

    

    -voidsayHi

    {      

        

    }

    

    @end

    

    

   3)调用:在别的类中

    

    #import"Student.h"

    

    Student *s=[[Student alloc]init]; //alloc分配内存空间 init初始化

    s.name=@"tt";   //只有用了@Property @synthesize 
  s.name才能用  俗称点语法 self.name

    [s sayHi];   // 不然只能通过实例方法访问实例变量(因为默认@protected)如果是public可以用 s->name访问(s本质上是指针)

    

    属性:@property(non atomicretain)NSString *name //相当于声明了setter
getter
方法

   @synthesize name = _name;        //.m文件中相当于实现了setter
getter方法  _name相当于在.h文件中声明了一个实例变量只是没看到

    

    

    注意:

    @property()里边的属性

    访问控制: readwrite(默认方式)      readonly(就没有setter方法)

    内存管理:assign 用于基本类型       retain用语对象   copy需要实现NScoping

    线程安全:atomic(默认)     nonatomic非原子性(一般用非原子性)

    

    

    

4.初始化方法

    

   1)指定初始化方法:实例方法

    

    声明: 

    -(id)initWithName:(NSString *)name;

    

    

    实现:

    -(id)initWithName:(NSString *)name

    {

       self=[super init]; //调用父类的指定初始化方法 以此判断指定初始化方法

        if (self)

        {

            _name=name;

        }

        return self;

    }

    

   2)一般初始化方法:实例方法

    

    声明:

    -(id)initWithName:(NSString *)name andAge:(int)age andSex:(NSString *)sex andTalent:(NSString *)talent andMate:(id)mate;

    

    

    实现:

    -(id)initWithName:(NSString *)name andAge:(int)age andSex:(NSString *)sex andTalent:(NSString *)talent andMate:(id)mate

    {

        self=[self initWithName:name];

        

        if (self)

        {

            _name=name;

            _age=age;

            _sex=sex;

            _talent=talent;

            _mate=mate;

        }

        return self;

    }

    

    

    调用:

    Rider *r=[[Rider alloc]initWithName:@"rider"andAge:25 andSex:@"M"andTalent:@"HP
30,MP 0,SP 30"
andMate:nil];

    

    注意:

    通常以init开头 返回值为id

   一个类只有一个指定初始化方法

   指定的初始化方法是必须执行的

   内部实现会调用到父类的初始化方法

    

    

    

    

    

   3)便利构造器:类方法

    

    声明:

    +(id)machineWithName:(NSString *)name andAge:(int)age andSex:(NSString *)sex andTalent:(NSString *)talent andMate:(id)mate;

    

    

    实现:

    +(id)machineWithName:(NSString *)name andAge:(int)age andSex:(NSString *)sex andTalent:(NSString *)talent andMate:(id)mate

    {

        Machine *mac=[[Machine alloc]initWithName:name andAge:age andSex:sex andTalent:talent andMate:mate]; //调用初始化方法

        return [mac autorelease];//便利构造器内部已经实现内存管理

    }

    

    

    调用:

    Machine *mac=[Machine machineWithName:@"machine"andAge:5 andSex:@"?"andTalent:@"HP
10,MP 0,PW 100"
andMate:nil];

    

    注意:

   便利构造器方法以类名开头

   类方法内部不能用实例变量

   类方法只能以类(名)来调用

    

    

    

    

   4)单例模式:

    

    声明:

    +(King *)defaultKing;

    

    

    实现:

    +(King *)defaultKing

    {

        static King *k=nil;

        if (k==nil

        {

            k=[[King alloc]init];

        }

        return k;

    }

    

    

    调用:

    King *k=[King defaultKing];

    k.name=@"king";

    k.age=100;

    k.sex=@"M";

    k.talent=@"PH 10,MP 10";

    k.mate=nil;

    

    注意:

   单例对象的类只能有一个实例 再次调用得到本来的内存地址

抱歉!评论已关闭.