一恬涧、基本語法
1注益、Objectiv-C簡介:
a、是C語言的基礎(chǔ)上溯捆,增加了一層最小的面向?qū)ο笳Z法丑搔;
b、完全兼容C語言提揍;
c啤月、可以在OC代碼中混入C語言代碼,甚至是C++代碼碳锈;
d顽冶、擴展名是:.m,想寫入c++代碼,擴展名改成 .mm售碳;
2强重、關(guān)鍵字:
基本上所有關(guān)鍵字都是以@開頭绞呈;例如:@interface,@implementation间景,@end佃声,@public等
3、字符串:
字符串以@開頭 如:@”hello”;而"hello"是C語言字符串倘要。
4圾亏、基本數(shù)據(jù)類型:char、int封拧、float志鹃、double、BOOL(YES/NO)泽西;
BOOL類型的本質(zhì):typedef signed char BOOL;
有兩種取值: YES/NO;
`#define YES (BOOL)1`
`#define NO (BOOL)0
BOOL的輸出:當整數(shù)來用 %d/%i;
5曹铃、nil相當于C語言中的NULL,也就是0捧杉;
6陕见、輸出語句:
NSLog(@"hello"); NSLog(@"hello,%d",15);//輸出內(nèi)容后會自動換行
NSLog的用法與printf區(qū)別:
a、NSLog是Foundation框架下的東西味抖,使用需要#import <Foundation/Foundation.h>评甜;使用printf需要 #include<stdio.h>
b、NSLog輸出時會自動換行仔涩,printf不會忍坷。
c、NSLog輸出時寫法@"xxxxx",參數(shù)需要的是NSString類型熔脂,而printf需要的是char* 類型的數(shù)據(jù)
d承匣、OC中的字符串如果想打印用NSLog的%@,printf不能使用%@進行輸出的
e锤悄、NSLog的時間初是不能去掉的
7、基本語句:
循環(huán)語句(do while嘉抒、while零聚、for)、條件語句(if些侍、if-else隶症、switch)
8、注釋:“//”和“/....../”
9岗宣、 開發(fā)過程和C語言類似:.m源文件->編譯->.o目標文件->鏈接->可執(zhí)行文件
a蚂会、加載Foundation框架的所有內(nèi)容#import <Foundation/Foundation.h>
b、#import用途:
(1)耗式、跟include一樣胁住,拷貝文件的內(nèi)容趁猴;
(2)、可以防止文件的內(nèi)容被重復(fù)拷貝彪见;
c儡司、編譯-鏈接-運行
編譯:cc –c 文件名.c;
鏈接:cc 文件名.o –framework Foundation
運行:./a.out
d余指、主頭文件:
(1)捕犬、最主要的頭文件,名字一般跟框架名稱一樣酵镜,包含了框架中的所有其他頭文件碉碉;
(2)、Foundation框架的主頭文件名稱就是Foundation.h淮韭;
(3)垢粮、只需要包含F(xiàn)oundation框架的主頭文件,就可以使用整個框架的東西缸濒;
10足丢、代碼簡單編寫:第一個OC程序
#import <Foundation/Foundation.h>
int main()
{
NSLog(@"第一個OC程序");
return 0;
}
跟C語言一樣庇配,OC程序的入口依然是main函數(shù)斩跌,只不過寫到一個.m文件中
二、類和對象
1捞慌、OC是面向?qū)ο蟮囊唬珻是面向過程的
區(qū)別分析:面向過程關(guān)注的是解決問題需要哪些步驟;面向?qū)ο箨P(guān)注的是解決問題需要哪些對象啸澡;兩種思想都能達到解決問題的目的袖订,但是解決思路不一樣;
2嗅虏、類和對象的關(guān)系:
類是對所有對象相同屬性的概括洛姑,就是對象的描述。
a皮服、面向?qū)ο箝_發(fā)步驟:首先考慮需要設(shè)計哪些類楞艾,再利用類創(chuàng)建多少個對象
(1)、設(shè)計類的步驟:類的名稱(有意義的類名)龄广,屬性硫眯,行為;
(2)择同、一般的名詞都是類两入,類名的第一個字母必須是大寫的,不能有下劃線敲才,多個英文單詞裹纳,用駝峰標識(每個英文單詞首字母大寫)择葡;
(3)、擁有相同(或類似)屬性和行為的對象都可以抽象出一個類痊夭;
(4)刁岸、哪個對象最清楚這個行為,就把這個行為寫到哪個對象中去她我;
3虹曙、創(chuàng)建一個OC類:
完整地寫一個類:類的聲明和類的實現(xiàn);(完整地寫一個函數(shù):函數(shù)的聲明和定義(實現(xiàn)))
類名:1>類名的第一個字母必須大寫番舆;2>不能有下劃線酝碳;3>多個單詞間用駝峰標識。例如JumpZoombie
a恨狈、類的聲明
@interface 類名 : NSObject// :NSObject目的是讓類具備創(chuàng)建對象的能力
{
成員變量(實例變量):數(shù)據(jù)類型 成員變量名;
}
方法聲明 - (數(shù)據(jù)類型)方法;
@end
b疏哗、類的實現(xiàn)
@implementation 類名
方法的實現(xiàn)
- (數(shù)據(jù)類型)方法
{
}
@end
c、使用注意
(1)禾怠、類的方法實現(xiàn)的時候返奉,方法內(nèi)可直接訪問成員變量
(2)、類在內(nèi)存中也占據(jù)存儲空間吗氏,從頭到尾只占據(jù)一塊存儲空間芽偏;
(3)、第一次創(chuàng)建對象的時候弦讽,首先分配內(nèi)存給類污尉,然后在分配內(nèi)存給創(chuàng)建的對象;
(4)往产、在使用類創(chuàng)建對象之前被碗,會將類加載進內(nèi)存(只有一次),類的內(nèi)存里只存放方法列表;
(5)仿村、定義的對象內(nèi)部都有一個默認的isa指針锐朴,指向?qū)ο笏鶎?yīng)的類;
(6)蔼囊、[p run]; [消息接收者 消息]:是給指針p所指向的對象發(fā)送一條run消息包颁,對象會順著isa指針找到對應(yīng)的類,去類里找run方法压真。
d、實例分析:
//目的:因為使用了NSObject
#import <Foundation/Foundation.h>
//1蘑险、類的聲明
//聲明對象的屬性滴肿、行為
//NSObject 目的是:讓Car這個類具備創(chuàng)建對象的能力
//OC對象本身是結(jié)構(gòu)體
@interface Car : NSObject
{
//@public可以讓外部的指針間接訪問對象內(nèi)部的成員變量
@public
//用來聲明對象屬性(成員變量,也叫實例變量佃迄,默認會初始化為0)
int wheels;//輪胎的個數(shù)
int speed;//時速(xxkm/h)
//實例變量不允許在這里初始化 int wheels = 4這種寫法是錯誤的
//不能隨便將成員變量當做C語言中的變量來使用 static int wheels;這種寫法是錯誤的
}
//方法(行為): 方法名 泼差、 參數(shù) 贵少、返回值 (聲明、實現(xiàn))
//只要是OC對象的方法堆缘,必須以減號 - 開頭
//OC方法中任何數(shù)據(jù)類型都必須用小括號()括住
//OC方法中的小括號()的作用只有一個:括住數(shù)據(jù)類型
- (void) run;
//類的聲明完畢
@end
//2滔灶、類的實現(xiàn)
//用來實現(xiàn)interface中聲明的方法
//方法的實現(xiàn)(說清楚方法里面有什么代碼)
@implementation Car
- (void) run
{
//方法內(nèi)可直接訪問、調(diào)用成員變量
NSLog(@"%d個輪子吼肥、%d車速的車跑起來了",wheels,speed);
}
//類的實現(xiàn)完畢
@end
int main()
{
//在使用類創(chuàng)建對象之前录平,會將類加載進內(nèi)存(只有一次),類的內(nèi)存里只存放方法列表
//定義的對象內(nèi)部都有一個默認的isa指針,指向?qū)ο笏鶎?yīng)的類
//OC中缀皱,想執(zhí)行一些行為斗这,就寫上一個中括號[行為執(zhí)行者,行為名稱]
//利用類來創(chuàng)建對象
//執(zhí)行了Car這個類的new行為來創(chuàng)建新的對象
//OC中只能用指針變量來間接操作對象
//定義了一個指針變量p,p將來指向的是Car類型的對象
//[Car new]會創(chuàng)建出一個新對象啤斗,并且會返回新對象本身(新對象的地址)
Car *p = [Car new];
Car *p2 = [Car new]; //又創(chuàng)建出一個新對象p2
//給p所指向?qū)ο蟮膚heels屬性賦值4
p->wheels = 4;
p2->speed = 300;
//給p所指向?qū)ο蟀l(fā)送一條run消息 (OC中的消息機制)
[p run];
[p2 run];
NSLog(@("p車有%d個輪胎,速度是%dkm/hnp2車有%d個輪胎,速度是%dkm/h"),p->wheels,p->speed,p2->wheels,p2->speed);
//將p里存儲的地址值表箭,賦值給了p3,兩個指向的地址值是相同的钮莲,指向同一個對象
Car *p3 = p;
p3->speed = 200;
[p run];
[p3 run];
//將p2里存儲的地址賦值給p
p = p2;
p->wheels = 3;
[p run];
[p2 run];
return 0;
}
4免钻、對象跟函數(shù)參數(shù)
a、OC里的對象不能自動回收崔拥;
b极舔、書寫類和對象注意事項:
(1)不能嵌套包含;
(2)方法的實現(xiàn)不能寫在@interface中握童;
(3)方法的聲明不能寫在@implementation中姆怪;
(4)方法的聲明不能寫在定義屬性的大括號{}中,一定要寫在外面
(5)類內(nèi)不能寫其他新的類澡绩,想寫另一個類稽揭,應(yīng)寫在@interface 類名 : NSObject @end @implementation 類名 @end的外面;
(6)在函數(shù)內(nèi)不能直接寫對象的實例變量肥卡;
(7)實例變量不允許初始化賦值溪掀;
(8)不能隨便將實例變量當做C語言中的變量(實例變量不能用 static 修飾);
(9)類的聲明必須放在main函數(shù)前面步鉴,類的實現(xiàn)可以放在后面揪胃;
(10)@implementation沒有@interface也可以創(chuàng)建對象
(11)@implementation中不能聲明和@interface一樣的成員變量
5、方法與函數(shù)的區(qū)別
a氛琢、方法
(1)喊递、對象方法都是以減號 - 開頭,變量類型用()括住
(2)阳似、OC方法的聲明必須寫在@interface和@end之間骚勘,方法的實現(xiàn)必須寫在@implementation和@end之間。也就是說OC方法不能獨立于類存在
(3)、對象方法只能由對象來調(diào)用
(4)俏讹、對象方法歸類對象所有
b当宴、函數(shù)
(1)、函數(shù)能寫在文件中的任意位置(@interface和@end之間除外)泽疆,函數(shù)歸文件所有
(2)户矢、函數(shù)調(diào)用不依賴于對象
(3)、函數(shù)內(nèi)部不能直接通過成員變量名訪問某個對象的成員變量
成員變量可以是任意類型殉疼,也可以是其他對象
6梯浪、方法的聲明和實現(xiàn)
a、OC方法中株依,一個參數(shù)對應(yīng)一個冒號:驱证;
b、冒號的作用:分隔方法調(diào)用時的參數(shù)值恋腕;
c抹锄、不帶參數(shù)的方法`- (double)pi; 方法名為pi`
d、帶一個參數(shù)的方法
- (int)square : (int)num; 方法名為square :(冒號也是方法名的一部分)
e荠藤、帶多個參數(shù)的方法
- (int)sumWithNum1 : (int)num1 andNum2 : (int)num2;
(方法名為 sumWithNum1: andNUm2: )
f伙单、同一個類中不允許兩個對象方法同名
7、匿名對象(沒有名字的對象)
@interface Car : NSObject
{
@public
int speed;
}
- (void) run;
@end
@implementation Car
- (void) run
{
NSLog(@"%d個輪子哈肖、%d車速的車跑起來了",wheels,speed);
}
@end
int main()
{
//屬性訪問
[Car new]->speed = 300;
//方法調(diào)用
//每次都會創(chuàng)建新的對象吻育,所以speed的值是0
[[Car new] run];
return 0 ;
}
不要寫類似匿名對象這樣的代碼!!!
對象調(diào)用類方法 內(nèi)存分析示意圖