IOS開發學習筆記009-OC基本知識

開始學習OC,時間不等人啊,要抓緊了。編程

OC基本知識app

新建一個以.m結尾的文件,這既是oc的程序文件。在oc程序中徹底兼容C語言。編譯好連接相似。框架

oc包含頭文件是使用#import <>ide

import 和include 的區別:函數

  1:import和include同樣的包含功能學習

  2:import能夠自動防止文件被重複拷貝this

1 #import <Foundation/NSObjCRuntime.h>//NSLog頭文件
2 //import 1:和include同樣
3 //       2:能夠自動防止文件被重複拷貝
4 int main()
5 {
6     NSLog(@"this is OC output");//自動換行
7     return  0;
8 }

若是使用Foundation框架,則編譯的時候須要添加參數 cc -c -framework Foundation a.mspa

每一個框架都有本身的主頭文件,和框架名同樣,包含全部頭文件。設計

若是有多個文件,編譯順序和c語言同樣: cc -c one.m two.m -framework Foundation指針

BOOL類型(OC特有的)

  定義:typedef signed char BOOL;

  兩種取值:

  #define YES (BOOL) 1

  #define NO (BOOL) 0

 1 #import <Foundation/Foundation.h>
 2 
 3 int main()
 4 {
 5     BOOL b = YES;//1
 6     BOOL b2 = NO;//0
 7     
 8     NSLog(@"%d\t%d",b,b2);//1    0
 9     return 0;
10 }

 

面向對象

萬物皆對象。

經常使用術語

  面向過程 Procedure Oriented

  面向對象 Object Oriented,簡稱OO

  面向對象編程 Object Oriented Programming,簡稱OOP

類和對象的區別

  類是對象的抽象。

  對象是類的實例。

類的構成:

   一、類名

      首字母大寫,不能下劃線,多個單詞每一個首字母大寫

   二、屬性

   三、行爲(功能)

類的實現

 

 1 /*
 2  3  一、類名
 4     首字母大寫,不能下劃線,多個單詞每一個首字母大寫
 5  二、屬性
 6  三、行爲(功能)
 7 */
 8 
 9 #import <Foundation/Foundation.h>//NSObject
10 
11 //一、類的聲明:屬性和行爲
12 @interface Car : NSObject//繼承NSObject,使類具備建立對象的功能
13 {
14     //屬性,也就是成員變量(實例變量),默認會初始化爲0,默認是保護屬性
15     @public
16     int wheels;//輪胎個數
17     int speed;//時速
18 }
19 
20 //方法(行爲):返回值,方法名,參數
21 //只要是oc對象的方法,必須以‘-’開頭
22 //OC方法中任何數據類型都必須用"()"括起來
23 //OC方法中小括號就是用來括住數據類型
24 - (void) run;
25 
26 @end
27 
28 
29 
30 
31 //二、類的實現,用力實現@interface中聲明的方法
32 @implementation Car
33 //方法的實現
34 - (void) run
35 {
36     NSLog(@"Running!");
37 }
38 @end
39 
40 int main()
41 {
42     //建立對象,返回對象的地址
43     Car *p = [Car new];//OC中執行任何行爲都須要這個 [行爲執行者 行爲];
44     p->wheels = 4;//賦值
45     p->speed = 60;//賦值
46     
47     [p run];//調用方法
48     
49     NSLog(@"speed is %d!",p->speed);//輸出速度
50 
51     return 0;
52 }

 

在類建立對象以前會把類加載到內存中,每一個對象還都有一個ISA 指針,指向這個類。

 

對象和函數的區別

  • OC方法只能聲明在@interface和@end之間,只能實如今@implementation和@end之間。也就是說OC方法不能獨立於類存在
  • C函數不屬於類,跟類沒有聯繫,C函數只歸定義函數的文件全部
  • C函數不能訪問OC對象的成員
  • 低級錯誤:方法有聲明,可是實現的時候寫成了函數
 1 #import <Foundation/Foundation.h>
 2 
 3 
 4 //一、類的聲明
 5 @interface Person: NSObject
 6 {
 7     @public
 8     int age;//年齡
 9     double weight;//體重
10 }
11 
12 
13 - (void)walk;//行走
14 
15 @end
16 
17 //函數1
18 void test(int age,int wei)
19 {
20     age = 20;
21     wei = 200;
22 }
23 //函數2
24 void test1(Person *p)
25 {
26     p->age = 20;
27     p->weight = 200;
28 }
29 
30 //二、類的實現
31 @implementation Person
32 //實現@interface中聲明的方法
33 - (void)walk//行走方法的實現
34 {
35     NSLog(@"The person whoes age is %d and weight is %f is walking !",age,weight);
36 }
37 
38 @end
39 
40 int main()
41 {   
42     Person *p1 = [Person new];//新建一個對象
43     p1->age = 25;//年齡賦值
44     p1->weight = 66.7;//體重賦值
45     [p1 walk];//walk方法調用
46     
47     Person *p2 = [Person new];//新建一個對象
48     p2->age = 45;//年齡賦值
49     p2->weight = 77.0;//體重賦值
50     [p2 walk];//walk方法調用
51     
52     //p2 = p1;//對象間賦值
53     
54     //對象和函數
55     test(p1->age,p1->weight);//值傳遞,不改變原值
56     [p1 walk];//walk方法調用
57     test1(p1);//傳地址,改變原值
58     [p1 walk];//walk方法調用
59 
60     return 0;
61 }

@interface 和@implementation分工

 

@interface 就至關於鐘錶表面

@implementation就是鐘錶內部的-實現

常見錯誤

  一、只有類的聲明,沒有類的實現

  二、漏了@end

  三、@interface和@implementation嵌套

  四、兩個類的聲明嵌套

  五、成員變量沒有寫在括號裏面

  六、方法的聲明寫在了大括號裏面

 

 

方法和函數的區別

 方法:

 一、方法都是以減號開頭的

 二、方法聲明必須寫在@interface和@end之間

      方法定義必須寫在@implementation和@end之間

 三、方法只能由對象來調用

 四、方法歸對象/類全部

 函數:

 一、函數歸文件全部,能寫在除#interface和@end之間的任意位置

 二、函數調用不依賴與對象

 

類的簡單設計

 

  1 #import <Foundation/Foundation.h>
  2 /*
  3  學生類:
  4  狗類
  5  */
  6 
  7 
  8 //性別
  9 typedef enum
 10 {
 11     SexMan,//男
 12     SexWoman//女
 13 } Sex;
 14 //生日
 15 typedef struct
 16 {
 17     int year;//年
 18     int month;//月
 19     int day;//日
 20 } Date;
 21 //顏色
 22 typedef enum
 23 {
 24     ColorBlack,//黑色
 25     ColorRed,//紅色
 26     ColorGreen//綠色
 27 } Color;
 28 
 29 //類的聲明:狗
 30 @interface Dog : NSObject
 31 {
 32     @public
 33     double weight;//體重
 34     Color curColor;//毛色
 35 }
 36 //方法聲明
 37 - (void) eat;//吃
 38 - (void) run;//走
 39 
 40 @end
 41 
 42 
 43 @implementation Dog
 44 
 45 //方法實現
 46 - (void) eat
 47 {
 48     weight += 1;
 49     NSLog(@"狗吃過體重是%f",weight);
 50 }
 51 
 52 - (void) run
 53 {
 54     weight -= 1;
 55     NSLog(@"狗溜過體重是%f",weight);
 56 }
 57 
 58 
 59 @end
 60 
 61 
 62 
 63 //類的聲明 :學生
 64 @interface Student : NSObject
 65 {
 66     @public
 67     Sex sex;//性別
 68     Date birthday;//生日
 69     double weight;//體重
 70     Color FavColor;//最喜歡的顏色
 71     char *name;//姓名
 72     //狗,對象中對象,指針
 73     Dog *dog;//OC中得其餘對象必須是指針
 74 }
 75 //方法聲明
 76 - (void) eat;//吃
 77 - (void) run;//走
 78 - (void) print;//輸出
 79 - (void) walkingDog;//遛狗
 80 - (void) feadDog;//喂狗
 81 @end
 82 
 83 //類的實現
 84 @implementation Student
 85 //方法實現
 86 - (void) eat
 87 {
 88     weight += 1;
 89     NSLog(@"吃過體重是%f",weight);
 90 }
 91 
 92 - (void) run
 93 {
 94     weight -= 1;
 95     NSLog(@"運動過體重是%f",weight);
 96 }
 97 
 98 - (void) print
 99 {
100     NSLog(@"Sex is %d,birthday is %d-%d-%d,favourate color is %d",sex,birthday.year,birthday.month,birthday.day,FavColor);
101 
102 }
103 
104 
105 - (void) walkingDog
106 {
107     [dog run];
108 }
109 - (void) feadDog
110 {
111     [dog eat];
112 }
113 @end
114 
115 
116 
117 int main()
118 {
119     Student *pStu = [Student new];//新建對象
120     pStu->dog = [Dog new];//新建狗對象
121     pStu->dog->weight = 20;//狗的體重
122     pStu->dog->curColor = ColorBlack;//狗的顏色
123     pStu->weight = 50;//學生體重
124     
125     pStu->sex = SexMan;//學生性別
126     
127     Date d = {1990,3,5};//學生年齡
128     pStu->birthday = d;//賦值
129     
130     pStu->FavColor = ColorGreen;//學生最喜歡的顏色
131     
132     pStu->name = "ZhangSan";//學生姓名
133     
134     [pStu eat];//調用方法eat
135     [pStu eat];//調用方法eat
136     [pStu run];//調用方法run
137     
138     [pStu print];//調用方法print
139     [pStu walkingDog];//調用方法
140     [pStu feadDog];//調用方法feadDog
141     return 0;
142 }

 

方法的參數

oc方法中,一個參數對應一個冒號。

- (int) pingfang:(int)num;//oc方法中,一個參數對應一個冒號. 方法名是pingfang: 包括後面的冒號。

- (int) SumwithNum1:(int)num1 andNum2:(int)num2;//冒號前能夠加描述,用於理解參數。方法名是:SumwithNum1:andNum2:

 

 1 #import <Foundation/Foundation.h>
 2 
 3 /*
 4  計算器類:
 5  返回數值n
 6  計算平方
 7  計算和
 8  */
 9 
10 @interface JiSuanQi : NSObject
11 
12 -(double) pi;
13 //方法名是 pingfang:
14 - (int) pingfang:(int)num;//oc方法中,一個參數對應一個冒號
15 //- (int) Sum:(int)a :(int)b;
16 //方法名是:SumwithNum1:andNum2:
17 - (int) SumwithNum1:(int)num1 andNum2:(int)num2;//冒號前能夠加描述,用於理解參數
18 @end
19 
20 
21 @implementation JiSuanQi
22 - (double) pi
23 {
24     return 3.14;
25 }
26 - (int) pingfang:(int)num//oc方法中,一個參數對應一個冒號
27 {
28     return num * num;
29 }
30 - (int) SumwithNum1:(int)num1 andNum2:(int)num2
31 {
32     return num1 + num2;
33 }
34 @end
35 
36 
37 int main()
38 {
39     JiSuanQi *p = [JiSuanQi new];//新建對象
40     double d= [p pi];//調用pi方法
41     NSLog(@"%f",d);
42     int n = [p pingfang:10];//調用平方方法
43     NSLog(@"%d",n);
44     //這樣寫比較好理解
45     int sum = [p SumwithNum1:10 andNum2:20];//調用方法sum
46     NSLog(@"%d",sum);
47     return 0;
48 }

練習2:

 1 /*
 2  3     方法:比較車速
 4  */
 5 
 6 //
 7 @interface Car : NSObject
 8 {
 9 @public
10     int speed;
11 }
12 - (int) comapreSpeedWithOther:(Car *)other;
13 
14 @end
15 
16 @implementation Car
17 - (int) comapreSpeedWithOther:(Car *)other
18 {
19     return speed - other->speed;
20 }
21 
22 @end
23 
24 int main()
25 {
26     Car *p1 = [Car new];
27     Car *p2 = [Car new];
28     p1->speed = 200;
29     p2->speed = 300;
30     int res = [p1 comapreSpeedWithOther:p2];
31     NSLog(@"%d",res);
32     return 0;
33 }
View Code

 

匿名對象的使用

[Car new]->speed = 300;//匿名對象

 

int main()

{

    //匿名對象,不要這樣寫,會形成內存泄露

    [Car new]->speed = 300;

    //不要這樣寫,會形成內存泄露

    [[Car new] run];

    return 0;

}

 

Xcode文檔安裝

一、直接找到Xcode文件路徑,把離線文件複製進去

  /Applications/Xcode.app/Contents/Developer/Documentation/DocSets

二、放到硬盤某路徑下

  /Users/用戶名/Library/Developer/Shared/Documentation/DocSets

相關文章
相關標籤/搜索