1.類與對象之objective-c

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;

    

    注意:

   單例對象的類只能有一個實例 再次調用得到本來的內存地址

發佈了16 篇原創文章 · 獲贊 11 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章