1、定義OC的類和建立OC的對象
要描述OC中的類分2大步驟:類的聲明、類的實現(定義)。跟函數相似,函數有分聲明和定義
1.類的聲明
1》代碼編寫
*定義一個Car類,擁有2個屬性:輪子數、時速,1個行爲:跑
*類名\屬性的命名規則:標示符的規則
*類名的命名規範:有意義、駝峯標識、首字母大寫函數
#import <Foundation/Foundation.h> // 類的聲明 @interface Car : NSObject { @public int wheels; // 多少個輪子 int speed; // 時速 } - (void)run; // 跑的行爲 @end
2》成員變量
@interface的大括號{}中聲明的變量:wheels、speed
@interface的大括號和函數的大括號是不同的
默認會初始化爲0
3》@public
@public可讓Car對象的wheels和speed屬性被外界訪問
4》NSObject
加上:NSObject的目的是讓Car類具有建立對象的能力
2.類的實現spa
// 類的實現 @implementation Car - (void) run { NSLog(@"%i個輪子,%i時速的車子跑起來了", wheels, speed); } @end
3.建立對象
1》代碼編寫設計
// 主函數 int main() { // 建立車子對象 Car *c = [Car new]; c->wheels = 3; c->speed = 300; [c run]; return 0; }
2》main函數的代碼分析、內存分析(對象在內存中有成員)
*[Car new]每次都會建立出新的對象,而且返回對象的地址,那麼就應該用一個指針變量保存對象的地址
Car *c = [Car new];
用一個指針變量c指向內存中的Car對象
*設置車子對象的屬性
跟用指向結構體的指針訪問結構體屬性同樣,用->
c->wheels = 3;
c->speed = 300;
4.建立多個Car對象
*分別只設置wheels、speed屬性
Car *c1 = [Car new];
c1->wheels = 4;
Car *c2 = [Car new];
c2->speed = 250;
[c1 run];3d
*1個賦值給另外一個,而後修改屬性
Car *c1 = [Car new];
c1->wheels = 4;
c1->speed = 250;
Car *c2 = c1;
c2->wheels = 3;
[c1 run];
5.面向對象封裝的好處
更加接近人類的思考方式
只須要關注對象,不須要關注步驟
6.對象與函數參數
對象成員變量做爲函數參數
指向對象的指針做爲函數參數
修改指向指向對象的成員
修改指針的指向
2、類的聲明和實現
1.@interface和@implementation的分工
@interface就好像暴露在外面的時鐘表面
@implementation就好像隱藏在時鐘內部的構造實現
2.聲明和定義多個類
3.常見錯誤
只有類的聲明,沒有類的實現
漏了@end
@interface和@implementation嵌套
兩個類的聲明嵌套
成員變量沒有寫在括號裏面
方法的聲明寫在了大括號裏面
4.語法細節
成員變量不能在{}中進行初始化、不能被直接拿出去訪問
方法不能當作函數同樣調用
成員變量\方法不能用static等關鍵字修飾,別跟C語言混在一塊兒(暫時忽略)
類的實現可用寫在main函數的後面,主要在聲明後面就好了
5.OC方法和函數的區別
OC方法只能聲明在@interface和@end之間,只能實如今@implementation和@end之間。也就是說OC方法不能獨立於類存在
C函數不屬於類,跟類沒有聯繫,C函數只歸定義函數的文件全部
C函數不能訪問OC對象的成員
低級錯誤:方法有聲明,可是實現的時候寫成了函數
6.OC的方法注意
方法只有聲明,沒有實現(經典錯誤)
方法沒有聲明,只有實現(編譯器警告,可是能調用,OC的弱語法)
編譯的時候:訪問沒有的成員變量直接報錯,訪問沒有的方法,只是警告
7.@implementation
沒有@interface,只有@implementation,也是能成功定義一個類的指針
@implementation Car : NSObject { @public int wheels; // 多少個輪子 int speed; // 時速 } - (void) run { NSLog(@"%i個輪子,%i時速的車子跑起來了", wheels, speed); } @end
@implementation中不能聲明和@interface同樣的成員變量
3、方法
設計一個Caculator計算器類,它擁有計算的功能(行爲)
1.不帶參數的方法
設計一個返回PI的方法code
// 方法聲明 - (double)pi; // 方法實現 - (double)pi { return 3.14; }
方法調用
2.帶一個參數的方法
設計一個計算平方的方法對象
// 方法聲明 - (double)square:(double)number; // 方法實現 - (double)square:(double)number { return number * number; }
方法調用
3.帶多個參數的方法
設計一個計算和的方法blog
// 方法聲明 - (double)sumOfNum1:(double)num1 andNum2:(double)num2; // 方法實現 - (double)sumOfNum1:(double)num1 andNum2:(double)num2 { return num1 + num2; }
方法調用
4.方法名注意
冒號也是方法名的一部分
同一個類中不容許兩個對象方法同名
4、匿名對象
屬性訪問
[Car new]->speed = 200;
方法調用
[ [Car new] run];
內存
5、代碼編譯器
1.第一個OC類
1 /* 2 類名:Car 3 屬性:輪胎個數、時速(速度) 4 行爲:跑 5 */ 6 7 // 由於使用了NSObject 8 #import <Foundation/Foundation.h> 9 10 // 完整地寫一個函數:函數的聲明和定義(實現) 11 // 完整地寫一個類:類的聲明和實現 12 13 // 1.類的聲明 14 // 聲明對象的屬性、行爲 15 // : NSObject 目的是:讓Car這個類具有建立對象的能力 16 @interface Car : NSObject 17 {// 用來聲明對象屬性(實例變量\成員變量,默認會初始化爲0) 18 // @public可讓外部的指針間接訪問對象內部的成員變量 19 @public 20 int wheels; // 輪胎個數 21 int speed; // 時速(xxkm/h) 22 } 23 24 // 方法(行爲):方法名、參數、返回值(聲明、實現) 25 // 只要是OC對象的方法,必須以減號 - 開頭 26 // OC方法中任何數據類型都必須用小括號()擴住 27 // OC方法中的小括號():括住數據類型 28 - (void)run; 29 30 @end 31 32 // 2.類的實現 33 // 用來實現@inteface中聲明的方法 34 @implementation Car 35 // 方法的實現(說清楚方法裏面有什麼代碼) 36 37 - (void)run 38 { 39 NSLog(@"車子跑起來了"); 40 } 41 42 @end 43 44 int main() 45 { 46 // 在OC中,想執行一些行爲,就寫上一個中括號[行爲執行者 行爲名稱] 47 // 利用類來建立對象 48 // 執行了Car這個類的new行爲來建立新對象 49 50 // 定義了一個指針變量p,p未來指向的是Car類型的對象 51 // [Car new]每次都會建立出一個新對象,而且會返回新對象自己(新對象的地址) 52 Car *p = [Car new]; 53 54 55 Car *p2 = [Car new]; 56 p2->wheels = 5; 57 p2->speed = 300; 58 [p2 run]; 59 60 // 給p所指向對象的wheels屬性賦值 61 p->wheels = 4; 62 p->speed = 250; 63 64 // 給p所指向對象發送一條run消息 65 [p run]; 66 67 NSLog(@"車子有%d個輪子,時速位:%dkm/h", p->wheels, p2->speed); 68 69 return 0; 70 }
2.第二個OC類
1 /* 2 人 3 類名:Person 4 屬性(成員變量\實例變量):體重、年齡 5 行爲(方法):走路、吃 6 */ 7 #import <Foundation/Foundation.h> 8 /* 9 1.類的聲明 10 * 成員變量 11 * 方法的聲明 12 */ 13 @interface Person : NSObject 14 { 15 @public 16 int age; 17 double weight; 18 } 19 20 - (void)walk; 21 - (void)eat; 22 23 @end 24 25 26 // 2.類的實現 27 @implementation Person 28 29 // 實現@interface中聲明的方法 30 - (void)walk 31 { 32 NSLog(@"%d歲、%f公斤的人走了一段路", age, weight); 33 } 34 35 - (void)eat 36 { 37 NSLog(@"%d歲、%f公斤的人在吃東西", age, weight); 38 } 39 40 @end 41 42 int main() 43 { 44 // 在使用類建立對象以前,會將類加載進內存 45 Person *p = [Person new]; 46 p->age = 20; 47 p->weight = 40; 48 49 [p eat]; 50 [p walk]; 51 52 Person *p2 = [Person new]; 53 p2->age = 30; 54 p2->weight = 60; 55 [p2 eat]; 56 [p2 walk]; 57 58 /* 59 Person *p2 = [Person new]; 60 p2->age = 30; 61 p2->weight = 50; 62 63 p = p2; 64 65 p->age = 40; 66 67 [p2 walk]; 68 */ 69 70 /* 71 Person *p = [Person new]; 72 p->age = 20; 73 74 Person *p2 = [Person new]; 75 p2->weight = 50.0; 76 77 [p walk]; 78 */ 79 80 /* 81 Person *p = [Person new]; 82 p->age = 20; 83 p->weight = 50.0; 84 [p walk]; 85 86 Person *p2 = [Person new]; 87 p2->age = 30; 88 p2->weight = 60.0; 89 [p2 walk]; 90 */ 91 return 0; 92 }
3.常見錯誤
1 /* 2 方法 3 1.對象方法都是以減號 - 4 2.對象方法的聲明必須寫在@interface和@end之間 5 對象方法的實現必須寫在@implementation和@end之間 6 3.對象方法只能由對象來調用 7 4.對象方法歸類\對象全部 8 9 函數 10 1.函數能寫在文件中的任意位置(@interface和@end之間除外),函數歸文件全部 11 2.函數調用不依賴於對象 12 3.函數內部不能直接經過成員變量名訪問某個對象的成員變量 13 14 */ 15 16 #import <Foundation/Foundation.h> 17 18 @interface Person : NSObject 19 @end 20 21 @implementation Person 22 @end 23 24 @interface Car : NSObject 25 {// 成員變量\實例變量 26 //int wheels = 4; 不容許在這裏初始化 27 //static int wheels; 不能隨便將成員變量當作C語言中的變量來使用 28 @public 29 int wheels; 30 } 31 32 - (void)run; 33 - (void)fly; 34 @end 35 36 int main() 37 { 38 // wheels = 10; 39 /* 40 Car *c = [Car new]; 41 c->wheels = 4; 42 //run(); 43 44 [c run]; 45 */ 46 47 void test2(); 48 49 test2(); 50 51 return 0; 52 } 53 54 @implementation Car 55 56 - (void) fly 57 { 58 59 } 60 61 /* 62 void test2() 63 { 64 NSLog(@"調用了test2函數-%d", wheels); 65 }*/ 66 67 void test() 68 { 69 NSLog(@"調用了test函數"); 70 } 71 72 - (void)run 73 { 74 test(); 75 NSLog(@"%d個輪子的車跑起來了", wheels); 76 } 77 @end