1. 程式人生 > >OC的開始(一)之----HelloWord與類的建立及使用

OC的開始(一)之----HelloWord與類的建立及使用

OC的全稱是Objective-C, 很明顯就是面向物件的C語言,是擴充C的面向物件程式語言。這裡就不再墨跡了,網上有太多的解釋,有興趣的朋友可以去查查。

進入正題,今天給想學OC的朋友講解一下怎麼建立一個OC工程和建立類並且例項化該類的過程。

在編寫程式之前,肯定要具備一個好的程式設計工具,這點你不用擔心,因為偉大的蘋果公司已經給我們準備好了:XCode(它是免費的,大家可以在App Store裡面下載)

一、首先建立一個工程,工程名叫Project_CreateClass

    1.開啟Xcode工具,選擇第二項Create a new Xcode Project,顧名思義建立一個Xcode工程

   

    2.選擇Command Line Tool 工程名:Project_CreateClass

       

 

        3.恭喜你,你已經成功的建立了一個工程,我在這裡說一下這個工程主要組成部分

          工程名:Project_CreateClass // 這裡是工程名 不用多說

                        |

                        |

                        資料夾:Project_CreateClass // 這裡是工程預設建立了一個資料夾名字就是工程名,當然我們可以在這個工程裡建立多個資料夾的。

                                      |

                                      |

                                      main.m // 這個main檔案就是我們這個工程唯一一個原始檔了,注意OC的原始檔拓展名為.m。原始檔也叫可執行檔案,不懂請問度娘。

          開啟main.m原始檔,程式碼如下:

//
//  main.m
//  Project_CreateClass
//
//  Created by NewbieLi on 15/5/2.
//  Copyright (c) 2015年 NewbieLi. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
    }
    return 0;
}
下面讓我們來分析下main.m檔案裡程式碼的含義吧:

#import <Foundation/Foundation.h>

#import關鍵字是用來匯入標頭檔案的,這個和Java中的import關鍵字效果差不多,不過OC不是開源的,所以,只能匯入標頭檔案,我們也只能看到標頭檔案中的定義,是看不到原始碼的。
這裡的Foundation.h標頭檔案是系統提供的最基本的框架,我們按住Command鍵,單擊就可以檢視Foundation.h中的所有定義了:

好啦,Hello World已經解決了,下面按command + R(執行快捷鍵一定要記住)執行你的程式檢視結果吧,執行結果如下:
2015-05-02 16:59:23.129 Project_CreateClass[2506:160795] Hello, World!

二、讓我們來建立自定義類:

        1.在Xcode右邊區域,右擊滑鼠選擇New file....

        2.然後選擇cocoa Class 選項 建立一個類,點選Next

        3.Class名我這裡叫Student,點選Next並完成建立

        4.建立完自定義類後,如圖:

這裡生成了兩個檔案(Student.h和Student.m),其中Student.h檔案是用來定義動作和成員變數的,但不會實現這個動作到底是幹嘛的,而Student.m檔案是現實Student.h定義的動作和成員變數的,下面我們開啟這兩個檔案分析下他們到底都是做什麼的。

        5.開啟Student.h,程式碼如下:

//
//  Student.h
//  Project_CreateClass
//
//  Created by NewbieLi on 15/5/2.
//  Copyright (c) 2015年 NewbieLi. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Student : NSObject

@end

我們可以看到Student.h類的修飾符是interface,不難理解,這是一個介面類。(面向物件的三大特性:封裝,繼承和多型,後面會講到,這裡就不多做解釋了。)在java中介面的作用就是定義方法和定義此類的特性,但不去實現該方法,而方法的實現交給實現類來做,在OC中也是同樣的道理。

        6.開啟Student.m,程式碼如下:

//
//  Student.m
//  Project_CreateClass
//
//  Created by NewbieLi on 15/5/2.
//  Copyright (c) 2015年 NewbieLi. All rights reserved.
//

#import "Student.h"

@implementation Student

@end

這個類就是實現Student.h的類了,好了,至此我們成功的建立了自定義類,接下來我們用程式碼去實現Student類的基本功能。

三、實現類的使用:

        1.編寫Student.h類,程式碼如下:

//
//  Student.h
//  Project_CreateClass
//
//  Created by NewbieLi on 15/5/2.
//  Copyright (c) 2015年 NewbieLi. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Student : NSObject
{
    /*
     @public 和java一樣是公共的成員 可以被專案中所有類呼叫
     @private 私有成員變數 只能在類的內部呼叫
     @protected 受保護的成員變數,只能被該類和子類呼叫
     不寫@public的話,預設是protected許可權
     */
@public // 訪問修飾符號表示下面的成員變數是公共的
    
    // 學生姓名
    NSString *_name;
    
    // 學生年齡
    int _age;
    
    // 學生愛好
    NSString *_hobby;
    
    // 學生地址
    NSString *_address;
}

// 方法宣告
-(void) sayHello; // 打招呼的方法

-(void) eat; // 吃飯的方法
@end
別急,我們來分析下這些程式碼都是什麼意思,首先,我們看到,在@interface下的“{}”中,聲明瞭若干變數來修飾學生的特性,在這裡這些修飾學生的變數我們就叫做成員變數。

@ public 就是用來說明這些成員變數的訪問等級,在程式碼中都有註解,這裡不多做解釋了。

下面我們來看類的實現部分,也就是方法的宣告:

// 方法宣告
-(void) sayHello; // 打招呼的方法

-(void) eat; // 吃飯的方法

減號(-)表明了該方法是例項方法,在類方法中則用(+)。括號中(void)表示返回型別,void表示無返回值,我們也可以寫成(int),(boolean),(NSString)等。eat和sayHello代表方法名。

        2.類的具體實現

在Student.m實現具體方法,程式碼如下:

//
//  Student.m
//  Project_CreateClass
//
//  Created by NewbieLi on 15/5/2.
//  Copyright (c) 2015年 NewbieLi. All rights reserved.
//

#import "Student.h"

@implementation Student

// 實現方法:
// 實現eat方法
- (void) eat {
    NSLog(@"學生開始吃飯了!");
}

// 實現sayHello方法
- (void) sayHello {
    NSLog(@"學生說:你好!");
}

+ (Student *)newStudent {
    return [[Student alloc] init];
}

@end

這裡就很好理解了,將介面類Student.h的eat和sayHello方法實現。

        3.物件的例項化及方法的呼叫

下面我們在main.m中進行Studentdui物件的初始化及呼叫,程式碼如下:

//
//  main.m
//  Project_CreateClass
//
//  Created by lanou3g on 15/5/2.
//  Copyright (c) 2015年 NewbieLi. All rights reserved.
//

#import <Foundation/Foundation.h>

#import "Student.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        // 建立物件,完成物件的宣告,例項化,初始化
        Student *stu = [[Student alloc] init];
        // 呼叫物件的sayHello方法
        stu.sayHello;
    }
    return 0;
}

執行看結果吧 command + R走起,結果:

2015-05-02 19:35:26.132 Project_CreateClass[3018:209079] 學生說:你好!

好了,至此我們成功的建立了一個物件並呼叫了它的sayHello方法。

四、下面來實現物件Student的成員變數的get,set方法。

        1.在介面Student.h中定義get,set方法,程式碼如下:

// 學生姓名的get方法
- (NSString *) getName;

// 學生姓名的set方法
- (void) setName : (NSString *) name;

// 學生年齡的get方法
- (int) getAge;

// 學生年齡的set方法
- (void) setAge : (int) age;

// 學生愛好的get方法
- (NSString *) getHobby;

// 學生愛好的set方法
- (void) setHobby : (NSString *) hobby;

// 學生地址的get方法
- (NSString *) getAddress;

// 學生地址的set方法
- (void) setAddress : (NSString *) address;

// 打印出學生的基本資訊
- (void) StudentMessage;

        2.在實現類Student.m中實現上面建立的方法,程式碼如下:
// 實現學生姓名的get方法
- (NSString *) getName {
    return _name;
}

// 實現學生姓名的set方法
- (void) setName : (NSString *) name {
    _name = name;
}

// 實現學生年齡的get方法
- (int) getAge {
    return _age;
}

// 實現學生年齡的set方法
- (void) setAge : (int) age {
    _age = age;
}

// 實現學生愛好的get方法
- (NSString *) getHobby {
    return _hobby;
}

// 實現學生愛好的set方法
- (void) setHobby : (NSString *) hobby {
    _hobby = hobby;
}

// 實現學生地址的get方法
- (NSString *) getAddress {
    return _address;
}

// 實現學生地址的set方法
- (void) setAddress : (NSString *) address {
    _address = address;
}

// 實現打印出學生的基本資訊
- (void) StudentMessage {
    // 打印出學生的基本資訊
    NSLog(@"學生姓名:%@,年齡:%d,愛好:%@,地址:%@", _name, _age, _hobby, _address);
}

        3.在main.m檔案中對物件Student的成員變數進行賦值,並呼叫set,get,StudentMessage方法。程式碼如下:
//
//  main.m
//  Project_CreateClass
//
//  Created by lanou3g on 15/5/2.
//  Copyright (c) 2015年 NewbieLi. All rights reserved.
//

#import <Foundation/Foundation.h>

#import "Student.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        // 建立物件,完成物件的宣告,例項化,初始化
        Student *stu = [[Student alloc] init];
        
        // 呼叫物件stu的set方法
        [stu setName:@"張三"];
        [stu setAge:18];
        [stu setHobby:@"籃球"];
        [stu setAddress:@"地球村"];
        
        // 運用get方法分別打印出物件stu成員變數的值
        NSLog(@"該學生的姓名是%@", [stu getName]);
        NSLog(@"該學生的年齡是%d", [stu getAge]);
        NSLog(@"該學生的愛好是%@", [stu getHobby]);
        NSLog(@"該學生的地址是%@", [stu getAddress]);
        
        // 呼叫物件stu的StudentMessage方法,打印出該學生的所有資訊
        stu.StudentMessage;
    }
    return 0;
}

這裡就和java差不多了(只是語法上存在這差距) [stu setName:@"張三"];給_name屬性賦值,[stu getName] 返回name值。

OK!由於本人第一次寫部落格,有不足的地方希望各位看官多多包涵。大笑