日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第一个OC的类

發布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第一个OC的类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

來源:http://www.cnblogs.com/mjios/archive/2013/04/06/3002814.html

本文目錄
  • 一、語法簡介
  • 二、用Xcode創建第一個OC的類
  • 三、第一個類的代碼解析
  • 四、添加成員變量
  • 五、添加方法
  • 六、跟Java的比較
  • 七、創建對象
  • 八、訪問公共成員變量和方法

說明:這個Objective-C專題,是學習iOS開發的前奏,也為了讓有面向對象語言開發經驗的程序員,能夠快速上手Objective-C。如果你還沒有編程經驗,或者對Objective-C、iOS開發不感興趣,請忽略。學習本專題之前,建議先學習C語言專題。

OC是一門面向對象的語言,因此它也有類、對象、靜態\動態方法、成員變量的概念。這講就來創建第一個OC的類。

回到頂部

一、語法簡介

1.類

在Java中,我們用1個.java文件就可以描述清楚一個類;在OC中,一般用2個文件來描述一個類:

1>?.h:類的聲明文件,用于聲明成員變量、方法。類的聲明使用關鍵字@interface@end

注意:.h中的方法只是做一個聲明,并不對方法進行實現。也就是說,只是說明一下方法名、方法的返回值類型、方法接收的參數類型而已,并不會編寫方法內部的代碼。

2>?.m:類的實現文件,用于實現.h中聲明的方法。類的實現使用關鍵字@implementation@end

?

2.方法

1> 方法的聲明和實現,都必須以?+?或者?-?開頭

  • +?表示方法(靜態方法)
  • -?表示對象方法(動態方法)

2>?在.h中聲明的所有方法作用域都是public類型,不能更改

?

3.成員變量

成員變量的常用作用域有3種:

1> @public?全局都可以訪問
2> @protected?只能在類內部和子類中訪問
3> @private?只能在類內部訪問

比Java少了一種作用域:包權限作用域,原因很明顯:OC沒有包名的概念。

?

回到頂部

二、用Xcode創建第一個OC的類

?1.右擊項目文件夾或者文件,選擇"New File"

?

2.選擇Cocoa的"Objective-C class"

?

3.輸入類名和選擇父類

這里的類名為Student,父類是NSobject

?

4.創建完畢后,項目中多了兩個文件

* Student.h是類的聲明文件,Student.m是類的實現文件

* 默認情況下,這2個文件的文件名跟類名一致

* 編譯器只會編譯.m文件,并不會編譯.h文件

?

回到頂部

三、第一個類的代碼解析

1.Student.h - 類的聲明文件

1 #import <Foundation/Foundation.h> 2 3 @interface Student : NSObject 4 5 @end

1> 看第3行,OC中使用關鍵字@interface來聲明一個類,@interface后面緊跟著類名Student。

2> 類名Student后面的冒號":"表示繼承,即第3行代碼的意思是Student繼承自NSObject。

3> 因為NSObject被聲明在Foundation.h中,所以在第1行用#import包含了Foundation.h文件。

4> 第5行的@end表示類的聲明結束了。@interface和@end是配套使用的。

?

2.Student.m - 類的實現文件

1 #import "Student.h" 2 3 @implementation Student 4 5 @end

1> 看第3行,OC中使用關鍵字@implementation來實現一個類。@implementation后面緊跟的類名,表示究竟要實現哪一個類。

2> 因為Student這個類是聲明在Student.h中的,所以在第1行用#import包含了Student.h文件。如果你不包含Student.h,第3行代碼肯定報錯,因為它根本不知道Student是個什么鬼東西。

3> 第5行的@end表示類的實現結束了。@implementation和@end是配套使用的。

?

回到頂部

四、添加成員變量

正常情況下,我們都是把成員變量定義在頭文件中,也就是類的聲明文件(.h)中

1.給Student添加一個成員變量

1 #import <Foundation/Foundation.h> 2 3 @interface Student : NSObject { 4 int age; // 年齡 5 } 6 7 @end

1> 第4行定義了一個int類型的成員變量age,age的默認作用域是@protected,即可以在Student類內部和子類中訪問

2> 成員變量必須寫在大括號{ }里面

?

2.設置成員變量的作用域

接下來給Student增加幾個不同作用域的成員變量

1 #import <Foundation/Foundation.h> 2 3 @interface Student : NSObject { 4 int age; // 年齡 5 6 @public 7 int no; // 學號 8 int score; // 成績 9 10 @protected 11 float height; // 身高 12 13 @private 14 float weight; // 體重 15 } 16 17 @end

一共有5個成員變量,其中

@public作用域的有:no、score

@protected作用域的有:age、height

@private作用域的有:weight

?

回到頂部

五、添加方法

前面我們定義了一個成員變量age,它的作用域是@protected,外界不能直接訪問它。為了保證面向對象數據的封裝性,我們可以提供age的get方法和set方法,讓外界間接訪問age。接下來在Student中添加age的get方法和set方法

1.在Student.h中聲明方法

1 #import <Foundation/Foundation.h> 2 3 @interface Student : NSObject { 4 int age; // 年齡 5 6 @public 7 int no; // 學號 8 int score; // 成績 9 10 @protected 11 float height; // 身高 12 13 @private 14 float weight; // 體重 15 } 16 17 // age的get方法 18 - (int)age; 19 20 // age的set方法 21 - (void)setAge:(int)newAge; 22 23 @end

1> 第18行聲明了age的get方法,方法名就叫做age,OC建議get方法的名字跟成員變量保持一致(如果是在Java中,就應該叫做getAge)

2> 第18行最面的?-?表示這是一個動態方法(?+?則表示靜態方法)。age前面的(int)表示方法的返回值為int類型,方法的返回值參數類型都需要用小括號()包住

3> 第21行聲明了age的set方法,前面的?-?表示動態方法,(void)表示方法沒有返回值

4> 在OC方法中,一個冒號:對應一個參數。由于第21行age的set方法接收一個int類型的參數,參數名為newAge,所以(int)newAge前面有一個冒號:

5> 一定要記住:一個冒號:對應一個參數,而且冒號:也是方法名的一部分。因此第21行set方法的方法名是setAge:,而不是setAge

?

再加大一下難度,假如增加一個方法可以同時設置age和height,那么就應該這樣寫:

1 - (void)setAge:(int)newAge andHeight:(float)newHeight;

* 這個方法是動態方法、沒有返回值,接收2個參數,所以有2個冒號:

* 這個方法的方法名是setAge:andHeight:

* 其實andHeight是可以省略的,它只是為了讓方法名念起來通順一點,也讓(float)newHeight前面的冒號:不那么孤單

?

2.在Student.m中實現方法

前面已經在Student.h中聲明了3個方法,接下來一一實現它們

1 #import "Student.h" 2 3 @implementation Student 4 5 // age的get方法 6 - (int)age { 7 // 直接返回成員變量age 8 return age; 9 } 10 11 // age的set方法 12 - (void)setAge:(int)newAge { 13 // 將參數newAge賦值給成員變量age 14 age = newAge; 15 } 16 17 // 同時設置age和height 18 - (void)setAge:(int)newAge andHeight:(float)newHeight { 19 age = newAge; 20 height = newHeight; 21 } 22 @end

第6行對age方法進行了實現,第12行對setAge:方法進行了實現,第18行對setAge:andHeight:方法進行了實現

?

回到頂部

六、跟Java的比較

如果是在Java中,一個Student.java文件就可以搞定成員變量和方法

1 public class Student { 2 protected int age; 3 protected float height; 4 5 public int no; 6 public int score; 7 8 private float weight; 9 10 /** 11 * age的get方法 12 */ 13 public int getAge() { 14 return age; 15 } 16 17 /** 18 * age的set方法 19 */ 20 public void setAge(int newAge) { 21 age = newAge; 22 } 23 24 /** 25 * 同時設置age和height 26 */ 27 public void setAgeAndHeight(int newAge, float newHeight) { 28 age = newAge; 29 height = newHeight; 30 } 31 }

?

回到頂部

七、創建對象

前面已經定義了一個Student類,成員變量和方法都有了,接下來看一下怎么使用這個類創建對象。

由于OC程序的入口點是main函數,所以在main.m文件中演示Student類的使用。

先上完整代碼

1 #import <Foundation/Foundation.h> 2 #import "Student.h" 3 4 int main(int argc, const char * argv[]) 5 { 6 @autoreleasepool { 7 Student *stu = [[Student alloc] init]; 8 9 [stu release]; 10 } 11 return 0; 12 }

1.包含Student.h

因為要用到Student這個類,所以在第2行包含了它的頭文件

#import "Student.h"

?

2.創建對象

1> 在Java中是使用關鍵字new來創建對象,比如new Student(),其實這句代碼做了2件事:

  • 給對象分配存儲空間
  • 調用Student的構造方法進行初始化

2> 在OC中創建對象也需要按順序做上面所述的2件事

1)調用Student類的靜態方法alloc分配存儲空間

Student *stu = [Student alloc];
  • OC是方法調用是用中括號[ ],方法調用者寫在括號左側,方法名寫在括號右側,中間留點空格。因此上面是調用了Student類的靜態方法alloc
  • 上面調用的alloc方法會返回分配好內存的Student對象,在等號左邊用了一個指向Student類型的指針變量stu來接收這個對象,注意stu左邊的*。所有OC對象都是用指針變量來接收的,如果你不了解指針,你記住下面這點就行了:利用類名定義一個變量時,類名后面一定要帶個*號。
  • alloc方法是這樣聲明的:
+ (id)alloc;

可以看到,它的返回值類型是id,這個id代表任何指針類型,你可以暫時理解為:id可以代表任何OC對象,類似于NSObject *。

?

2)調用Student對象的構造方法init進行初始化

前面調用alloc方法返回的Student對象stu是不能正常使用的,因為僅僅是分配了內存,并沒有進行初始化,接下來調用對象的init方法進行初始化

stu = [stu init];

看清楚了,由于init是動態方法,所以這里使用stu變量來調用,并不是使用類名來調用。init會返回已經初始化完畢的對象,再次賦值給了stu變量。這時候的Student對象stu才能正常使用。

?

3)其實,我們最常見的做法是將alloc和init連起來使用:

Student *stu = [[Student alloc] init];

相信有面向對象開發經驗的你一眼就能看懂了,在main.m完整代碼的第7行

?

3.銷毀對象

由于OC不支持垃圾回收,因此當不再使用某個對象時,需要調用對象的release方法釋放此對象。我們在第9行銷毀了stu對象

[stu release];

這個release方法在這里調用一次即可,不要覺得多調用多幾次,對象就會釋放地干凈一點,這樣做會很危險,容易造成野指針錯誤。

?

4.其他

1> 也可以調用靜態方法new快速創建一個對象

1 Student *stu = [Student new]; 2 3 [stu release];

不過我們還是習慣使用alloc和init來創建對象

2>?前面我們調用了Student的alloc、init、new方法,但是你會發現Student.h中并沒有聲明這些方法,為什么能夠調用呢?原因很簡單,這些方法都是父類NSObject的,子類當然可以調用父類的方法。

?

回到頂部

八、訪問公共成員變量和方法

前面已經成功創建了一個Student對象,接下來訪問一下它的公共變量和方法。

1 #import <Foundation/Foundation.h> 2 #import "Student.h" 3 4 int main(int argc, const char * argv[]) 5 { 6 @autoreleasepool { 7 Student *stu = [[Student alloc] init]; 8 9 // 訪問公共變量no 10 stu->no = 10; 11 12 // 調用setAge:方法設置變量age的值 13 [stu setAge:27]; 14 15 // 調用setAge:andHeight:方法同時設置變量age和height的值 16 [stu setAge:28 andHeight:1.88f]; 17 18 // 訪問公共變量no 19 int no = stu->no; 20 // 調用age方法獲取變量age的值 21 int age = [stu age]; 22 23 // 打印no和age的值 24 NSLog(@"no is %i and age is %i", no, age); 25 26 [stu release]; 27 } 28 return 0; 29 }

1.第7行創建了Student對象,第26行銷毀了對象

2.第10行和第19行訪問了Student對象的公共成員變量no,如果不是公共變量,不能像這樣直接訪問。注意訪問方式:對象->成員變量

3.第13行調用了Student對象的setAge:方法,傳入參數27修改了成員變量age的值

4.第16行調用了Student對象的setAge:andHeight:方法,同時修改了成員變量age和height的值

5.第21行調用了Student對象的age方法獲取成員變量age的值

6.第24行輸出了age和no的值,輸出結果:

2013-04-06 21:54:56.221 第一個OC程序[1276:303] no is 10 and age is 28




總結

以上是生活随笔為你收集整理的第一个OC的类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。