【學習筆記】【OC語言】建立對象

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
相關文章
相關標籤/搜索