1.類型系統(tǒng)
引用類型:類class 指針pointer 塊block
值類型:基礎(chǔ)數(shù)據(jù)類型(int double float)报辱、結(jié)構(gòu)struct滔灶、枚舉 enum
類型裝飾:協(xié)議protocol璧微、類別category戳吝、擴(kuò)展extension
2.類
首先要定義一個(gè)接口文件:
作用:描述對(duì)外調(diào)用
@interface RPoint:NSObject
//屬性 數(shù)據(jù)成員 表達(dá)的是一個(gè)狀態(tài)
@property int x;
@property int y;
//方法 表示的是對(duì)象的行為 -代表實(shí)例方法 返回值是void 無參數(shù)
-(void) print;
@end```
實(shí)現(xiàn).m文件
@implementation RPoint
- (void)print
{
NSLog(@"[%d,%d]",self.x,self.y);//當(dāng)前的實(shí)例對(duì)象
}
@end```
在main函數(shù)中調(diào)用
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
/*
創(chuàng)建一個(gè)對(duì)象實(shí)例 RPoint是一個(gè)類型 動(dòng)態(tài)內(nèi)存分配向系統(tǒng)請(qǐng)求->初始化會(huì)默認(rèn)調(diào)用構(gòu)造器 將x.y初始化為0
*/
RPoint *rp1 = [[RPoint alloc] init];
rp1.x = 10;
rp1.y = 20;
[rp1 print];//給對(duì)象發(fā)消息
SPoint sp1;//編譯器直接定義內(nèi)存大小
sp1.x = 10;
sp1.y = 20;
}
3.類VS結(jié)構(gòu)
類叫做引用類型定躏,結(jié)構(gòu)叫做值類型澜掩,存儲(chǔ)不同购披。
對(duì)象:棧上存儲(chǔ)指針(引用),它指向堆上的對(duì)象
值:實(shí)例(值)內(nèi)存直接存儲(chǔ)于椉玳牛空間
4.棧(stack)VS 堆(heap)
理解棧和堆的區(qū)別與特點(diǎn)
棧:存儲(chǔ)值類型
*無ARC的負(fù)擔(dān)刚陡,由系統(tǒng)直接管理惩妇,以執(zhí)行函數(shù)為單位
*空間大小編譯時(shí)就已經(jīng)確定了(參數(shù)+局部變量 sizeof)
*函數(shù)結(jié)束之后,系統(tǒng)立即回收
*函數(shù)之間通過拷貝值傳遞
*具有局部性筐乳,大小有限額歌殃,超出會(huì)stack overflow
堆:存儲(chǔ)引用類型對(duì)象
*分配由程序員手動(dòng)請(qǐng)求(創(chuàng)建時(shí))
*釋放時(shí)由ARC機(jī)制自動(dòng)釋放
*函數(shù)之間通過拷貝引用(指針)傳遞
*具有全局性,總體大小無限制
5.通過畫UML內(nèi)存圖的方式蝙云,理解值類型與引用類型的區(qū)別氓皱。
曾看到這樣比喻:值類型就是現(xiàn)金,要用直接用勃刨;引用類型是存折波材,要用還得先去銀行取現(xiàn)。
- 聲明一個(gè)值類型變量身隐,編譯器會(huì)在棧上分配一個(gè)空間廷区,這個(gè)空間對(duì)應(yīng)著該值類型變量,空間里存儲(chǔ)的就是該變量的值贾铝。
- 引用類型的實(shí)例分配在堆上隙轻,新建一個(gè)引用類型實(shí)例,得到的變量值對(duì)應(yīng)的是該實(shí)例的內(nèi)存分配地址忌傻,這就像您的銀行賬號(hào)一樣大脉。
代碼如下:
void process(RPoint *rp3,SPoint sp3);
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
RPoint *rp1 = [[RPoint alloc] init];
rp1.x = 10;
rp1.y = 20;
[rp1 print];//給對(duì)象發(fā)消息 [10 20]
SPoint sp1;//編譯器直接定義內(nèi)存大小
sp1.x = 100;
sp1.y = 200;//[100 200]
NSLog(@"-----------拷貝----------");
RPoint *rp2 = rp1;
rp2.x++;
rp2.y++;
[rp2 print];//[11 21]
SPoint sp2 = sp1;
sp2.x++;//101
sp2.y++;//201
NSLog(@"-----------傳參----------");
process(rp1, sp1);
[rp1 print];//12 22
}
return 0;
}
void process(RPoint *rp3,SPoint sp3)
{
rp3.x++;//12
rp3.y++;//22
sp3.x++;//101
sp3.y++;//201
[rp3 print];
}