OC簡介
在
C語言的基礎(chǔ)上,Objective - C增加了一層最小的面向?qū)ο笳Z法完全兼容
C語言可以在
OC代碼中混入C語言,甚至是C++代碼可以使用
OC開發(fā)Mac OS X平臺(tái)和iOS平臺(tái)的應(yīng)用OC是面向?qū)ο蟮模?code>C是面向過程的,只是解決問題的不同思想面向?qū)ο螅P(guān)注解決問題需要哪些東西)如,打電話找手機(jī)
面向過程(關(guān)注解決問題需要哪些步驟)如,打開手機(jī),按號(hào)碼,撥打
-
面向?qū)ο蠓庋b的好處
- 更接近人類的思考方式
- 只需要關(guān)注對(duì)象,不需要關(guān)注步驟
OC語法概括
-
基本所有關(guān)鍵字都是以
@開頭@interface、@implementation、@end、@public、@protected @private、@selector、@try、@catch、@throw、@protocol @optional、@required、@class、@property、@synthesize self、super、id、__cmd、__block、__strong、__weak - 字符串以
@開頭
比如@"Hello"是OC中的字符串,而"Hello"則是C語言中的字符串 - 其他語法
| 基本數(shù)據(jù)類型 | int、char、float、double、BOOL(YES\NO)[本質(zhì)是char] |
|---|---|
nil |
相當(dāng)于C語言中的NULL,也就是 0 |
| 基本語句 | 循環(huán)語句do while 、while 、for、條件語句if、if-else、switch
|
| 注釋 |
//單行注釋、/*...*/多行注釋 |
| 屏幕輸出 |
NSLog(@"Hello");、NSLog(@"age is %i",24);會(huì)自動(dòng)換行 |
OC程序的開發(fā)過程
.m源文件-> 編譯 ->.o目標(biāo)文件-> 鏈接 ->a.out可執(zhí)行文件
OC基礎(chǔ)知識(shí)
-
#import的用途- 跟
#include一樣,拷貝文件的內(nèi)容 - 可以自動(dòng)防止文件的內(nèi)容被重復(fù)拷貝
- 跟
-
類和對(duì)象的關(guān)系
-
OC中的類相當(dāng)于造東西的圖紙,用來描述一類事物,也就是說,要想創(chuàng)建對(duì)象,必須先有類 - 利用
類來創(chuàng)建對(duì)象,對(duì)象是類的具體存在 - 面向?qū)ο蠼鉀Q問題應(yīng)該是,先考慮需要設(shè)計(jì)哪些
類,再利用類創(chuàng)建多少個(gè)對(duì)象 - 每個(gè) "對(duì)象" 內(nèi)部默認(rèn)有個(gè) "isa 指針" 指向它的類
- 所有 "對(duì)象" 共用一份方法
- 每個(gè)類中有個(gè)“superclass 指針”指向它的父類
-
-
需要設(shè)計(jì)哪些
類,如何設(shè)計(jì)類-
類的設(shè)計(jì),只關(guān)心3樣?xùn)|西-
類名(事物名稱):人(VampireJune)- 第一個(gè)字母必須是大寫
- 不能有下劃線
- 多個(gè)英文單詞用駝峰標(biāo)識(shí)
-
屬性(配置) :身高(height)、年齡(age) -
行為(功能):跑(run)、吃(eat)
-
一般名詞都是
類擁有相同(或類似)屬性和行為的對(duì)象都可以抽出一個(gè)
類
-
-
完整地寫一個(gè)
類:類的聲明和實(shí)現(xiàn)// 引入 "Foundation" 框架,因?yàn)槭褂昧?"NSObject" #import <Foundation/Foundation.h> 1. 類的聲明:聲明對(duì)象的屬性和行為 @interface VampireJune : NSObject // 關(guān)鍵字 "@interface" 和 類名 "VampireJune" 之間必須有一個(gè)空格 // NSObject 目的是:讓 "VampireJune" 這個(gè)類具備創(chuàng)建對(duì)象的能力 // ":" :類名 "VampireJune" 和 "NSObject" 之間的冒號(hào)是繼承語法 {// 大括號(hào)里 "只能" 用來聲明 "對(duì)象屬性"( 實(shí)例變量\成員變量)默認(rèn)會(huì)初始化為0 // @public 可以讓外部的指針間接訪問對(duì)象內(nèi)部的成員變量 @public // "屬性" (成員變量)默認(rèn)是被保護(hù)的,不允許指針直接訪問 int age; // 年齡,屬性命名完,寫一個(gè) ";" 英文分號(hào),告訴這個(gè)屬性結(jié)束了 double weight; // 體重 } // 大括號(hào)里 "只能" 用來聲明 "對(duì)象屬性",必須要有 大括號(hào) // 方法(行為): 方法名、參數(shù)、返回值 // 聲明:在 "@interface @end" 中聲明,不能放到大括號(hào)內(nèi) // 實(shí)現(xiàn):在 "@implementation @end" 中實(shí)現(xiàn) - (void) run; // 只要是OC對(duì)象的方法,必須以減號(hào) "-" 開頭 // OC方法中任何數(shù)據(jù)類型都必須用小括號(hào) "()" 括住 // OC方法中的小括號(hào) "()" :括住數(shù)據(jù)類型 @end // 表示類聲明完畢 2. 類的實(shí)現(xiàn) // 用來實(shí)現(xiàn) "@interface @end" 中聲明的方法 @implementation VampireJune // 方法的實(shí)現(xiàn)(說清楚方法里面有什么代碼) - (void) run { // 訪問自己對(duì)象內(nèi)部的屬性,直接寫屬性名 NSLog(@"%d歲、%f公斤的人跑起來了",age,weight); * "對(duì)象" 調(diào)用某個(gè)方法,會(huì)跟隨 "isa 指針" 找到對(duì)應(yīng)的類,在類里面找一找有沒有這個(gè)方法 * 一旦發(fā)現(xiàn)有,就調(diào)用這個(gè)方法,來到方法對(duì)應(yīng)的代碼,訪問當(dāng)前對(duì)象的成員變量 } @end int main() { // 在OC中,想執(zhí)行一些行為,就寫上一個(gè)中括號(hào) [行為執(zhí)行者 行為名稱]; // 利用類來創(chuàng)建對(duì)象 // 執(zhí)行了 "VampireJune" 這個(gè)類的 "new" 行為來創(chuàng)建新對(duì)象 // [VampireJune new] 會(huì)創(chuàng)建出一個(gè)新對(duì)象,并返回新對(duì)象本身(新對(duì)象地址) // OC中想修改操縱對(duì)象,只能用指針 // 定義了一個(gè)指針變量 "v",將來指向 "VampireJune" 類型的對(duì)象 VampireJune *v = [VampireJune new]; // 給 "v" 所指向的對(duì)象的 "age" 屬性賦值 v->age = 23; v->weight= 60.0; NSLog(@" age is %d,weight is %f",v->age,v->height); // 給 "v" 所指向?qū)ο?發(fā)送一條 "run" 消息(OC的消息機(jī)制) // 就會(huì)調(diào)用 這個(gè)對(duì)象的 "run" 方法,就會(huì)去對(duì)象的實(shí)現(xiàn)里面找這個(gè)方法 // 一旦找到這個(gè)方法,就會(huì)執(zhí)行這個(gè)方法里面的代碼 [v run]; return 0; } -
@implementation
- 沒有
@interface,只有@implementation,也能成功定義一個(gè)類 -
@implementation中不能聲明和@interface一樣的成員變量
- 沒有
@implementation Car : NSObject
{
@public
int wheels; // 輪子
int speed; // 速度
}
- (void)run
{
NSLog(@"%d個(gè)輪子,%dkm/h的車跑起來了",wheels,speed);
}
@end
-
對(duì)象與函數(shù)參數(shù)- 對(duì)象成員變量作為函數(shù)參數(shù)
- 指向?qū)ο蟮闹羔樧鳛楹瘮?shù)參數(shù)
- 修改指向?qū)ο蟮某蓡T
- 修改指針的指向
常見錯(cuò)誤
- 只有類的聲明,沒有類的實(shí)現(xiàn)
- 漏了
@end -
@interface和@implementation嵌套 - 兩個(gè)類的聲明嵌套
- 成員變量沒有寫在括號(hào)里面
- 方法的聲明寫在了大括號(hào)里面
語法細(xì)節(jié)
- 方法不能當(dāng)做函數(shù)一樣調(diào)用
- 成員變量不能在{}中進(jìn)行初始化、不能被直接拿去訪問
- 類的實(shí)現(xiàn)可以寫在
main函數(shù)的后面,一定寫在類的聲明后面就可以
對(duì)象方法和函數(shù)的區(qū)別
-
對(duì)象方法
-
對(duì)象方法都是以減號(hào)-開頭 -
對(duì)象方法必須聲明在 "@interface @end" 之間,必須實(shí)現(xiàn)在 "@implementation @end"之間,對(duì)象方法不能獨(dú)立與類存在 -
對(duì)象方法只能由對(duì)象調(diào)用 -
對(duì)象方法歸類\對(duì)象所有 -
對(duì)象方法中能訪問當(dāng)前對(duì)象的成員變量(實(shí)例變量)
-
-
函數(shù)
-
函數(shù)不屬于類,跟類沒有關(guān)系,只歸定義函數(shù)的文件所有 -
函數(shù)能寫在文件中的任意位置(除"@interface @end"之間) -
函數(shù)內(nèi)部不能直接通過成員變量名訪問某個(gè)對(duì)象的成員變量
-
對(duì)象方法的聲明規(guī)范
- 方法首字母小寫
- 從第二個(gè)單詞開始,首字母大寫
- 盡量寫的像句子一樣,可讀性好
- 形參首字母小寫,超過一個(gè)單詞,其他首字母大寫
- 形參與形參之間,一定要有一個(gè)空格
- 一個(gè)形參對(duì)應(yīng)一個(gè)冒號(hào),冒號(hào)也是方法名的一部分
- 返回值永遠(yuǎn)只有一個(gè)
- 類方法聲明規(guī)范上面全部適用,只是減號(hào)
-變?yōu)榧犹?hào)+ - 同一個(gè)類中不允許有兩個(gè)對(duì)象方法同名
// 1. 無返回值
// 1.1 無形參
- (void)pi; // 方法名 :-pi
// 1.2 有形參
- (void)squareWithNum:(int)num; // 方法名 :-squareWithNum:
// 2. 有返回值
// 2.1 無形參
- (int)pi; // 方法名 :-pi
// 2.2 有形參
- (int)sumWithNum1:(int)num1 andNum2:(int)num2;
// 方法名 :-sumWithNum1: andNum2:
對(duì)象方法圖例
// 無形參 有返回值
- (double)pi; // 方法名 :-pi
// 方法調(diào)用
[c pi];

方法解析1.jpg

方法調(diào)用1.jpg
// 有1個(gè)形參 有返回值
- (double)square:(double)number; // 方法名 :-square:
// 方法調(diào)用
[c square: 10];

方法解析2.jpg

方法調(diào)用2.jpg
// 有多個(gè)形參 有返回值
- (double)sumOfNum1:(double)num1 andNum2(double)num2;
// 方法名 :-sumOfNum1: andNum2:
// 方法調(diào)用
[c sumOfNum1: 10 andNum2: 21];

方法解析3.jpg

方法調(diào)用3.jpg