天天看點

OC--類與對象

                                                                              OC--類與對象

OC的基本特征

oc檔案以.m結尾,一般會加入拷貝檔案#import <Foundation/Foundation.h>

Oc編譯運作格式:

l  cc –c 檔案名.m

l  cc 檔案名.o –framework Foundation

l  ./a.out

#import的用途:

1>    跟#include一樣,拷貝檔案的内容

2>    可以自動防止檔案的内容被重複拷貝

輸出語句:

NSLog(@”這是一個oc程式!!!”);//帶有自動換行功能

類:指的是某一類東西,而不是一個(例如”車“類,車有豐田,現代,奧迪等等)

類的注意事項:

1>    類名

*類名的第一個字母必須是大寫

*不能有下劃線

*多個英文單詞,用駝峰辨別法

2>屬性:名詞

3>行為(功能):動詞

1.  類的聲明

*成員變量

*方法的聲明

@interface 類名 : NSObject

{

@public

成員變量;//(類型 變量名稱;)

Int wheels;//輪胎  最好加上備注,提高可讀性

成員變量;

……………….

}

方法聲明;(動詞行為)// -(資料類型)方法名;

- (void)run;

……………

@end

2. 類的實作

@implementation 類名

//用來實作@interface中聲明的方法

-(資料類型)方法名

{ 方法内容;  }

-(void)run

{

NSLog(@”車子在奔馳着”);

}                                                    

@end

int main()

{

類名 *指針名 = [類名 new]; //為類建立對象,對象一建立就會配置設定記憶體

指針名 ->變量名稱 = 值;//變量名稱為屬性裡的變量名稱

[指針名 方法名];//調用方法

return 0;

<pre name="code" class="cpp">#import <Foundation/Foundation.h>
//1.類的聲明
//用來聲明對象的屬性,行為
//: NSObject 目的是:讓Car這個類具備建立對象的能力
@interface Car : NSObject
{
// 用來聲明對象屬性(成員變量,預設會初始化為0)
@public//可以讓外部的指針間接通路對象内部的成員變量
int wheels;//輪胎個數
int speed;//時速(xxkm/h)
}
//方法(行為):方法名,參數,傳回值(聲明,實作)
//隻要是OC對象的方法,必須以 - 開頭
//OC方法中任何資料類型都必須用小括号()包覆
//OC方法中的小括号():包覆資料類型
-(void)run;
@end
 
//2.類的實作
//用來實作@interface中聲明的方法
@implementation Car
- (void)run
{
//可直接通路内部類對對應屬性的值
NSLog(@”有%d個輪子的車子,以時速為%dkm/h跑着”,  wheels, speed);
}
@end
int main()
{
//在OC中,想執行一些行為,就寫上一個中括号[行為執行者,行為名稱]
//利用類來建立對象
//執行了Car這個類的new
//定義了一個指針變量p,p将來指向的是Car類型的對象
//[Car new];每次都會建立一個新的對象,并且會傳回新對象本身(新對象的位址)
Car * p = [Car new];//調用對象時候會傳回位址
//給指針所指向對象的屬性指派
p->wheels = 4;
p->speed = 250;
//給p所指向的對象發送一條run消息,并調用執行
[p run];
NSLog(@”車子的輪子有%d,時速:%dkm/h”, p -> wheels, p ->speed);
return 0;
}
           

如果要對以建立的對象進行值修改,可以通過指針形式

接上上面我們在建立一個對象:p2

Car *p2 = p;//把指針p的值指派給p2,此時,p和p2指向同一個對象位址
p2 -> wheels = 5;//把對象裡的屬性值通過指針位址進行修改,修改成功
[p run];//此時輸出改後的值:車子的輪子有5,時速:250km/h
           

通過指針對類的屬性值進行修改 

#import <Foundation/Foundation.h>
@interface Car : NSObject
{// 成員變量
    @public
    int wheels;
    int speed;
}

- (void)run;
@end

@implementation Car
- (void)run
{
    NSLog(@"%d個輪子,速度為%dkm/h的車子跑起來", wheels, speed);
}
@end

void test(int w, int s)
{
    w = 20;
    s = 200;
}

void test1(Car *newC)
{
    newC->wheels = 5;
}

void test2(Car *newC)
{
    Car *c2 = [Car new];
    c2->wheels = 5;
    c2->speed = 300;
    
    newC = c2;
    newC->wheels = 6;
}

int main()
{
    Car *c = [Car new];
    c->wheels = 4;
    c->speed = 250;
    
    //test(c->wheels, c->speed);//隻對函數的值進行修改,并沒有把對象的改動
    //test1(c);//通過指針傳遞,對對象的位址進行屬性修改
    test2(c); //通過指針傳遞,畫圖好好分析和test1相似  
    [c run];    
    return 0;
}
           

常見錯誤

l   隻有類的聲明,沒有類的實作

l   漏了@end

l  @interface和@implementation嵌套

l   兩個類的聲明嵌套

l   成員變量沒有寫在括号裡面

l  成員變量例的屬性不能直接指派,必須建立對象後,通過指針對象指派

l  方法的聲明寫在了大括号裡面

OC方法和函數的差別

 方法

 1.對象方法都是以減号 - 

 2.對象方法的聲明必須寫在@interface和@end之間

   對象方法的實作必須寫在@implementation和@end之間

 3.對象方法隻能由對象來調用

 4.對象方法歸類\對象所有

 函數

 1.函數能寫在檔案中的任意位置(@interface和@end之間除外),函數歸檔案所有

 2.函數調用不依賴于對象

 3.函數内部不能直接通過成員變量名通路某個對象的成員變量

l  OC方法隻能聲明在@interface和@end之間,隻能實作在@implementation和@end之間。也就是說OC方法不能獨立于類存在

l  C函數不屬于類,跟類沒有聯系,C函數隻歸定義函數的檔案所有

l  C函數不能通路OC對象的成員

l  低級錯誤:方法有聲明,但是實作的時候寫成了函數

對象嵌套

#import <Foundation/Foundation.h>
//性别枚舉,并通過typedef重新定義為Sex
typedef enum {
    SexMan,
    SexWoman
} Sex;
//結構體定義,并通過typedef重新定義為Date
typedef struct {
    int year;
    int month;
    int day;
} Date;
//顔色枚舉,并通過typedef重新定義為Color
typedef enum {
    ColorBlack,
    ColorRed,
    ColorGreen
} Color;
//對狗進行類的聲明
@interface Dog : NSObject
{
    @public
    double weight; // 體重
    Color curColor; // 毛色
}


- (void)eat;
- (void)run;
@end
//對狗進行類的實作
@implementation Dog
- (void)eat
{
    // 每吃一次,體重就加1
    weight += 1;
    //weight = weight +  1;
    NSLog(@"狗吃完這次後的體重是%f", weight);
}
- (void)run
{
    weight -= 1;
    NSLog(@"狗跑完這次後的體重是%f", weight);
}
@end
/*
學生
成員變量:性别、生日、體重、最喜歡的顔色、狗(體重、毛色,吃、跑)
方法:吃、跑步、遛狗(讓狗跑)、喂狗(讓狗吃)
*/
@interface Student : NSObject
{
    @public
    Sex sex; // 性别
    Date birthday; // 生日
    double weight; // 體重(kg)
    Color favColor; // 最喜歡的顔色
    char *name;
    
    // 重點:狗
    Dog *dog;//定義狗的類型為指針Dog *,其變量名為dog
}
- (void)eat;
- (void)run;
- (void)print;


- (void)liuDog;//對狗執行的動作
- (void)weiDog;//對狗執行的動作
@end


@implementation Student
//将學生的行為進行實作,并通過方法調用狗的行為
- (void)liuDog
{
    // 讓狗跑起來(調用狗的run方法)
    [dog run];//對狗的行為的調用
}


- (void)weiDog
{
    // 讓狗吃東西(調用狗的eat方法)
    [dog eat];
}


- (void)print
{
    NSLog(@"性别=%d, 喜歡的顔色=%d, 姓名=%s, 生日=%d-%d-%d", sex, favColor, name, birthday.year, birthday.month, birthday.day);
}


- (void)eat
{
    // 每吃一次,體重就加1
    weight += 1;
    //weight = weight +  1;
    NSLog(@"學生吃完這次後的體重是%f", weight);
}


- (void)run
{
    weight -= 1;
    NSLog(@"學生跑完這次後的體重是%f", weight);
}
@end


int main()
{
    Student *s = [Student new];
    
    Dog *d = [Dog new];
    d->curColor = ColorGreen;
    d->weight = 20;
    s->dog = d;//通過指針将狗的對象,傳遞給學生的dog對象
        
    [s liuDog];    
    [s weiDog];
    return 0;
}


void test()
{
    Student *s = [Student new];
    s->weight = 50;    
    // 性别
    s->sex = SexMan;    
    // 生日
    Date d = {2011, 9, 10};//注意結構體的指派形式
    s->birthday = d;  
    s->name = "Jack";
    
    /*
     s->birthday.year = 2011;
     s->birthday.month = 9;
     s->birthday.day = 10;
     */
    
    // 喜歡的顔色
    s->favColor = ColorBlack;
    /*
     [s eat];
     [s eat];
     
     [s run];
     [s run];
     */
    
    [s print];
}
           

方法的具體定義和實作

1.不帶參數的方法

 設計一個傳回PI的方法

// 方法聲明

- (double)pi;

//方法實作

- (double)pi

{

    return 3.14;

}

OC--類與對象

 方法調用

OC--類與對象

2.帶一個參數的方法

  設計一個計算平方的方法

// 方法聲明

- (double)square:(double)number;

//方法實作

- (double)square:(double)number

{

    return number * number;

}

OC--類與對象

 方法調用

OC--類與對象

3.帶多個參數的方法

設計一個計算和的方法

// 方法聲明

- (double)sumOfNum1:(double)num1andNum2:(double)num2;

//方法實作

- (double)sumOfNum1:(double)num1andNum2:(double)num2

{

    return num1 + num2;

}

OC--類與對象

 方法調用

OC--類與對象

4. 方法名注意

l  冒号也是方法名的一部分

l  同一個類中不允許兩個對象方法同名

繼續閱讀