一弯汰、基礎(chǔ)語法
OC相對于C
a. 在C的基礎(chǔ)上新增了面向?qū)ο蟮恼Z言
b. 將C的復(fù)雜、繁瑣的語法封裝的更為簡單
c. OC完全兼容C語言OC程序的源文件后綴名是.m m代表message 代表OC當(dāng)中最重要的一個機(jī)制 消息機(jī)制
C程序的源文件的后綴名.cmain函數(shù)仍然是OC程序的入口和出口
int類型的返回值代表程序的結(jié)束狀態(tài)
main函數(shù)的參數(shù): 仍然可以接收用戶在運(yùn)行程序的時候傳遞數(shù)據(jù)給程序湖雹,
參數(shù)也可以不要#import指令
1). 以#號開頭咏闪,是1個預(yù)處理指令
2). 作用: 是#include指令的增強(qiáng)版。將文件的內(nèi)容在預(yù)編譯的時候拷貝在寫指令的地方
3). 增強(qiáng): 同一個文件無論#import多少次摔吏,只會包含一次
如果#include指令要實(shí)現(xiàn)這個效果鸽嫂,就必須要配合條件編譯指令來實(shí)現(xiàn)
而#import指令只需要直接包含就可以
4). 簡要原理: #import指令在包含文件的時候,底層會先判斷這個文件是否被包含征讲,
如果被包含就會被略過据某,否則才會包含诗箍。-
框架
1). 是一個功能集 蘋果或者第三方事先將一些程序在開發(fā)程序時經(jīng)常要用到的功能事先寫好
把這些功能封裝在一個類或函數(shù)中滤祖,這些函數(shù)和類的集合就叫做框架氨距。
有點(diǎn)像C語言的函數(shù)庫2). Foundation框架
Foundation: 基礎(chǔ) 基本. 這個框架當(dāng)中提供了一些最基本的功能 輸入輸出俏让, 數(shù)據(jù)類型Foundation.h 這個文件當(dāng)中包含了Foundation包含了其他所有的頭文件 只要包含F(xiàn)oundation.h就想當(dāng)于包含了框架當(dāng)中所有的頭文件首昔。
@autoreleasepool{} 自動釋放池
代碼寫在這個大括號中NSLog函數(shù)
1). 作用: 是printf函數(shù)的增強(qiáng)版, 向控制臺輸出信息
2). 語法:
NSLog(@"格式控制字符串", 變量列表);
最簡單語法:
NSLog(@"要輸出的信息");
3). 增強(qiáng):
a. 輸出一些調(diào)試相關(guān)的信息
2020-07-01 12:40:05.175 Day01-OC基礎(chǔ)用法 [792:213878] Hello,World
執(zhí)行代碼的時間 程序名稱 792是進(jìn)程編號,213878是線程編號 輸出信息
可用于測試程序執(zhí)行時間
b. 會自動換行
c. OC新增的數(shù)據(jù)類型的變量的值只能使用NSLog函數(shù)輸出
4). 用法和printf函數(shù)差不多
5). 使用注意:
a. NSLog函數(shù)的第一個參數(shù)前面必須要加1個@符號
b. 如果在字符串的末尾加1個'\n'代表換行, 那么函數(shù)的自動換行會失效字符串
1). C語言的字符串的存儲方式
a. 使用字符數(shù)組存儲
b. 使用字符指針
2). OC當(dāng)中更為好用的存儲字符串的類型. NSString
NSString類型的指針變量專門用來存儲OC字符串的地址
3). OC的字符串必須要使用1個前綴@符號
"jack" 是一個C語言的字符串
@"jack" 是一個OC的字符串常量
NSString 類型的指針變量只能存儲OC字符串的地址
4). 使用
NSString *str = @"jack";
5). 總結(jié)
a. 在OC中專門設(shè)計了1個NSString類型來存儲字符串
b. 字符串分為C字符串和OC字符串
c. 區(qū)分: 是否有@前綴
6). 注意
a. NSLog函數(shù)的第1個參數(shù)是OC字符串
b. 輸出
NSString *str = @"jack";
NSLog(str);
c. 如果要使用NSLog函數(shù)中的占位符輸出字符串的值, 應(yīng)使用"%@"NS前綴
NextStep --> Cocoa --> Foundation框架之中@符號
1). 將C字符串轉(zhuǎn)換為OC字符串
"jack" ->> @"jack"
2). OC當(dāng)中的絕大部分關(guān)鍵字是以@符號開頭注釋:
和C語言的注釋一模一樣, 分為單行注釋和多行注釋-
函數(shù)的定義和調(diào)用: 與C語言的函數(shù)調(diào)用是一樣的
void test();// 聲明
void test(){// 實(shí)現(xiàn)}
二巧骚、OC與C的對比
OC程序的編譯劈彪、鏈接沧奴、執(zhí)行
1). 在.m文件中寫上符合OC程序的源代碼
2). 使用編譯器將源代碼編譯為目標(biāo)文件
cc -c xx.m
a. 預(yù)處理
b. 檢查語法
c. 編譯
3). 鏈接
cc xx.o
如果程序中使用到了框架中的函數(shù)或者類,那么在鏈接時就必須要告訴編譯器去哪里找Foundation框架
cc xx.o -framework Foundation
4). 鏈接成功后, 就會生成1個a.out可執(zhí)行文件, 使用"./a.out"執(zhí)行-
OC程序和C程序各個階段的后綴名對比
源文件 目標(biāo)文件 可執(zhí)行文件
C .m .o .out
OC .m .o .out
- OC中的數(shù)據(jù)類型
1). OC中支持C語言中的所有的數(shù)據(jù)類型
a. 基本數(shù)據(jù)類型
int double float char
b. 構(gòu)造類型
數(shù)組 結(jié)構(gòu)體 枚舉
c. 指針類型
d. 空類型
e. typedef自定義類型
2). BOOL 類型
BOOL b1;
a. 可以存儲YES或者NO中的任意1個數(shù)據(jù)(必須是大寫).
b. 一般情況下BOOL類型的變量用來存儲條件表達(dá)式的結(jié)果.
c. BOOL的本質(zhì)
typedef signed char BOOL;
實(shí)際上BOOL類型的變量是1個有符號的char變量
#define YES ((BOOL)1)
#define NO ((BOOL)0)
4). Boolean
a. Boolean類型的變量可以存儲true或者false
b. 一般情況下BOOL類型的變量用來存儲條件表達(dá)式的結(jié)果.
c. 本質(zhì)
typedef unsigned char Boolean;
#define true 1
#define false 0
5). class 類型. 類
6). id 類型 萬能指針.
7). nil 與 null 差不多
8). SEL 方法選擇器
9). block 代碼段
三、 面向過程與面向?qū)ο?/p>
OC是在C的基礎(chǔ)之上
1). 將C復(fù)雜的語法封裝的更為簡單
2). 在C語言的基礎(chǔ)之上新增了一小部分的面向?qū)ο蟮恼Z法-
實(shí)現(xiàn)需求之一:
1). 要把大象放進(jìn)冰箱應(yīng)該怎么辦?
a. 打開冰箱門
b. 把冰箱放進(jìn)去
c. 把冰箱門關(guān)上2). 買電腦的需求的實(shí)現(xiàn)方式:
a. 根據(jù)自己的需求和預(yù)算確定買的電腦型號
10000 iOS開發(fā)
b. 在網(wǎng)上查資料 確定型號
rMMP 9288
c. 去到數(shù)碼產(chǎn)品中心
d. 找到Apple專賣店
e. 砍價 成交
f. 回家3). 更好的方式:
a. 自己做
強(qiáng)調(diào)的是過程, 步驟. 我是主角
b. 別人做
強(qiáng)調(diào)的比人. 我是指揮者面向過程: 如果解決1件事情的時候嚣潜,每一件事情都是我們親自去一步步實(shí)現(xiàn)
面向?qū)ο? 如果解決1件事情的時候郑原,自己不去做犯犁,而是專門找一個人去做 代碼世界的面向過程與面向?qū)ο?
1). 面向過程
在遇到1個需求的時候酸役,每個步驟都是自己親自寫代碼完成
2). 面向?qū)ο?br> 在遇到1個需求的時候涣澡,而是找一個專門做這件事的人-
面向?qū)ο蠛兔嫦蜻^程優(yōu)缺點(diǎn)
C語言是一門面向過程的語言. 有功能的概念, 但是沒有人的概念.
OC語言是一門面向?qū)ο蟮恼Z言.面向過程解決問題的缺點(diǎn): 后期維護(hù)和修改不方便.
面向?qū)ο蠼鉀Q問題的優(yōu)點(diǎn): 后期維護(hù)和修改方便. 如何使用面向?qū)ο笤O(shè)計程序
當(dāng)遇到一個需求的時候入桂,不要親自去實(shí)現(xiàn).
1). 先看看有沒有現(xiàn)成的框架做這件事
2). 如果沒有抗愁,就自己實(shí)現(xiàn)對象: 現(xiàn)實(shí)生活中的一個具體存在, 看得見蜘腌、摸得著撮珠,拿過來可以直接使用
類: 是對一群具有相同特征或者行為的事物的統(tǒng)稱.抽象的,不能直接使用.
類和對象之間的關(guān)系
四芯急、 類與對象
請問先有類還是先有對象
1). 現(xiàn)實(shí)角度 一定是先有對象再有類
2). 代碼角度 一定是先有類再有對象類的作用: 描述一群具有相同特征和行為的事物
-
如何定義類
1). 類的三要素: 類名/特征/行為
2). 定義類的語法
a. 位置. 直接寫在源文件中
b. 類的定義分為兩部分
--> 類的聲明
@interface 類名 : NSObject
{
這類事物具有的共同特征, 將他們定義為變量
}
功能就是方法娶耍,將聲明寫在這里
@end
--> 類的實(shí)現(xiàn)
@implementation 類名
將方法的實(shí)現(xiàn)寫在這里
@end
3). 注意
a. 類必須要有聲明和實(shí)現(xiàn)
b. 類名用你描述事物的名稱來命名.
類名的每個單詞單詞首字母必須要大寫.
c. 用來表示這類事物共同特征的變量必須要定義在@interface中的大括號中
d. 定義在大括號用來表示類事物共同特征的變量叫屬性伺绽、成員變量澜掩、實(shí)例變量杖挣、字段...
e. 屬性名必須要以下劃線開頭示例:
// 聲明 @interface Person : NSObject { NSString *_name; int _age; float _height; } @end // 實(shí)現(xiàn) @implementation Person @end
-
類是無法直接使用的. 如果非要使用這個類,必須要先找到這個類的具體存在
1). 如何創(chuàng)建一個類的對象
語法: 類名 *對象名 = [類名 new];
Person *p1 = [Person new];//創(chuàng)建Person對象
p1對象的特點(diǎn):
->> 可以直接使用
->> 類定定義的東西, 對象都有 -
如何使用對象
1). 如何訪問對象的屬性:
a. 默認(rèn)情況下株汉,對象的屬型是不允許被外界直接訪問的
如果允許對象的屬性可以被外界訪問歌殃,聲明屬性時加@public關(guān)鍵字
b. 訪問對象的屬性的方式
對象名->屬性名 = 值;
對象名->屬性名;
(對象名).屬性名 = 值;
(對象名).屬性名示例:
// 聲明 @interface Person : NSObject { @public NSString *_name; int _age; float _height; } @end // 實(shí)現(xiàn) @implementation Person @end // 使用-- 平時建議使用這種形式 Person *p1 = [Person new]; p1->_name = @"jack"; p1->_age = 19; p1->_height = 178.5f; NSLog(@"p1對象的_name屬性的值是%@", p1->_name); (*p1)._name = @"jack"; (*p1)._age = 19; (*p1)._height = 178.5f;
-
方法的聲明和調(diào)用
// 聲明 @interface Person : NSObject { 屬性: 類的特征 } 方法: 類的功能 @end // 實(shí)現(xiàn) @implementation Person 方法實(shí)現(xiàn) @end
-
無參數(shù)方法聲明
1). 聲明
a. 位置: 在@interface的大括號的外面
b. 語法:
- (返回值類型) 方法名稱;
- (void)run;
表示聲明了1個無返回值的并且無參數(shù)的方法, 名字叫run
2). 實(shí)現(xiàn)
a. 位置: 在@implementation之中實(shí)現(xiàn)
b. 語法: 將方法聲明拷貝到@implementation中,去掉分號追加大括號3). 調(diào)用
a. 方法是無法直接調(diào)用的, 必須要創(chuàng)建對象
b. 調(diào)用對象的方法.
[對象名 方法名];示例:
// 聲明 @interface Person : NSObject{ NSString *_name; int _age; } - (void)run; @end // 實(shí)現(xiàn) @implementation Person - (void)run{ NSLog(@"Hello,World!"); } @end // 調(diào)用 Person *p1 = [Person new]; [p1 run];
-
帶1個參數(shù)的方法
1). 聲明
a. 位置: 在@interface的大括號的外面
b. 語法:
- (返回值類型) 方法名稱:(參數(shù)的類型)形參名稱;
- (void)eat:(NSString *)foodName;
表示聲明了1個無返回值的含有一個參數(shù)的方法, 名字叫"eat:",有一個參數(shù)類型是NSString *類型路召,參數(shù)的名字叫foodName
2). 實(shí)現(xiàn)
a. 位置: 在@implementation之中實(shí)現(xiàn)
b. 語法: 將方法聲明拷貝到@implementation中,去掉分號追加大括號3). 調(diào)用
a. 方法是無法直接調(diào)用的, 必須要創(chuàng)建對象
b. 調(diào)用對象的方法.
[對象名 方法名:實(shí)參];示例:
// 聲明 @interface Person : NSObject{ NSString *_name; int _age; } - (void)run; - (void)eat:(NSString *)foodName; @end // 實(shí)現(xiàn) @implementation Person - (void)run{ NSLog(@"Hello,World!"); } - (void)eat:(NSString *)foodName{ NSLog(@"給我的%@真好吃",foodName); } @end // 調(diào)用 Person *p1 = [Person new]; [p1 run]; [p1 eat:@"紅燒排骨"];
方法頭中的數(shù)據(jù)類型都要用1個小括號括起來.
- (返回值類型)方法名稱:(參數(shù)類型)參數(shù)名稱;
-
帶多個參數(shù)的方法
1). 聲明
a. 位置: 在@interface的大括號的外面
b. 語法:
- (返回值類型) 方法名稱:(參數(shù)的類型)參數(shù)名稱1 :(參數(shù)類型)參數(shù)名稱2.股淡。唯灵。;
- (int)sum:(int)num1 :(int)num2;
表示聲明了1個返回值為int的含有兩個參數(shù)的方法, 名字叫"sum: :",有兩個參數(shù) 參數(shù)類型都是int類型, 參數(shù)名稱叫做num1,num2
2). 實(shí)現(xiàn)
a. 位置: 在@implementation之中實(shí)現(xiàn)
b. 語法: 將方法聲明拷貝到@implementation中,去掉分號追加大括號3). 調(diào)用
a. 方法是無法直接調(diào)用的, 必須要創(chuàng)建對象
b. 調(diào)用對象的方法.
[對象名 方法名:實(shí)參1 :實(shí)參2];示例:
// 聲明 @interface Person : NSObject{ NSString *_name; int _age; } - (void)run; - (void)eat:(NSString *)foodName; - (int)sum:(int)num1 :(int)num2; @end // 實(shí)現(xiàn) @implementation Person - (void)run{ NSLog(@"Hello,World!"); } - (void)eat:(NSString *)foodName{ NSLog(@"給我的%@真好吃",foodName); } - (int)sum:(int)num1 :(int)num2{ int num3 = num1 + num2; return num3; } @end // 調(diào)用 Person *p1 = [Person new]; [p1 run]; [p1 eat:@"紅燒排骨"]; int sum = [p1 sum:10 :20]; NSLog(@"sum = %d",sum);
帶參數(shù)的方法聲明的規(guī)范:--提高閱讀性.
1). 如果方法只有1個參數(shù): 要去最好這個方法的名字叫做xxxWith:
- (void)eatWithFood:(NSString *)foodName;
2). 如果方法有多個參數(shù): 方法名With: (參數(shù)類型)參數(shù)名稱1 and:(參數(shù)類型)參數(shù)名稱2;
- (int)sum:(int)num1 and:(int)num2;
3). 更詳細(xì)的寫法
方法名With參數(shù)1:(參數(shù)類型)參數(shù)名稱1 and參數(shù)2:(參數(shù)類型)參數(shù)名稱2...
- 其他使用注意
1). 快捷
a. 快速實(shí)現(xiàn)方法: - -> 空格 方法名
b. 快速創(chuàng)建對象: 對象 new -> 右括號(自動補(bǔ)齊)