1.类与对象之objective-c

 1.ObjC跟C的区别与联系

 

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

 

2.ObjC中的类与对象

 

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

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

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

 

注意:

  1. 命名规则 类名首字母大写  Student  方法名首字母小写(驼峰)-(void)sayHi
  2. -  实例方法     +  类方法

 

3.类的创建和使用

 

 

声明:在.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

 

实现:在.m文件中

 

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

 

@implementation Student

 

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

{

   int _age=age;

}

-(int)getAge

{

    return _age;

}

 

-(void)sayHi

{      

 

}

 

@end

 

 

调用:在别的类中

 

#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 atomic,retain)NSString *name;  //相当于声明了setter getter方法

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

 

 

  1. 注意:
  1. @property()里边的属性

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

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

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

 

 

 

对象初始化三个方法(实例方法用-   类方法用+)

 

  1. 指定初始化方法:实例方法
  2.  

声明: 

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

 

 

实现:

-(id)initWithName:(NSString *)name

{

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

    if (self)

    {

        _name=name;

    }

    return self;

}

 

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

 

声明:

-(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];

 

注意:

  1. 通常以init开头 返回值为id
  2. 一个类只有一个指定初始化方法
  3. 指定的初始化方法是必须执行的
  4. 内部实现会调用到父类的初始化方法

 

 

 

 

 

便利构造器:类方法

 

声明:

+(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];

 

注意:

  1. 便利构造器方法以类名开头
  2. 类方法内部不能用实例变量
  3. 类方法只能以类(名)来调用

 

 

 

 

单例模式:

 

声明:

+(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;

 

注意:

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

你可能感兴趣的:(ios,Objective-C,oc)