開始學習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 指針,指向這個類。
對象和函數的區別
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 }
匿名對象的使用
[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