類型如下:
引用類型:reference type
類:class
指針:pointer
塊:block
值類型:value type
基礎(chǔ)數(shù)值類型
結(jié)構(gòu):struct
枚舉:enum
類型裝飾
協(xié)議:protocol
類別:category
擴(kuò)展:extension
類:class VS 結(jié)構(gòu)體 struct
類:
接口:@interface 指的是對(duì)外可見的部分。
接口文件
@interface Point(類名):NSObject(繼承的類)
屬性定義 ? 屬性:對(duì)象的狀態(tài)
@property int x;
實(shí)例方法:方法是行為
-(void)prints;返回值時(shí)void的。
@end
比如初始化對(duì)象。
Point *p1=[Point alloc] init];//先分配內(nèi)存,接著初始化。
p1:就叫做對(duì)象。
對(duì)象的空間分析:
對(duì)象:棧上存儲(chǔ)的是指針,堆上存儲(chǔ)的是真正的對(duì)象。
類:是引用類型
指針:存在棧上
實(shí)體對(duì)象:存在堆上
結(jié)構(gòu)是值類型
值類型,直接存在棧上。
重點(diǎn) 棧(stack)VS 堆(heap)
棧:存儲(chǔ)值類型
無ARC(自動(dòng)引用計(jì)數(shù))負(fù)擔(dān),由系統(tǒng)自動(dòng)管理,以執(zhí)行函數(shù)為單位(一個(gè)函數(shù)一個(gè)棧,一個(gè)棧的大?。焊鶕?jù)類型,參數(shù),函數(shù)變量等來計(jì)算)
空間大小,編譯時(shí)確定(參數(shù)+局部變量)
函數(shù)執(zhí)行時(shí),系統(tǒng)自動(dòng)分配一個(gè)stack棧。
函數(shù)執(zhí)行結(jié)束時(shí),系統(tǒng)立即收回stack棧。
函數(shù)之間通過拷貝值傳遞。
具有局部性,大小有限制(一般就幾兆),超出會(huì)(stack)棧overflow(溢出)。一般不會(huì)溢出,除非你寫出死循環(huán),超大遞歸會(huì)導(dǎo)致溢出,棧的負(fù)擔(dān)比較小。
堆:存儲(chǔ)引用類型對(duì)象
分配由程序員手動(dòng)請(qǐng)求(創(chuàng)建對(duì)象的時(shí)候)
釋放由運(yùn)行時(shí)的ARC機(jī)制自動(dòng)釋放(確定時(shí))
函數(shù)之間通過拷貝引用(指針)傳遞。
具有全局性,總體無大小限制(受制于系統(tǒng)內(nèi)存整體大小),最自由也會(huì)最容易出問題,內(nèi)存泄漏問題。
例子如下:
RPoint.h
#import
@interface RPoint : NSObject
//屬性
@property int x;
@property int y;
//打印方法
-(void)prints;
@end
類實(shí)現(xiàn)文件
? RPoint.m
#import "RPoint.h"
@implementation RPoint
//實(shí)現(xiàn)打印方法
-(void)prints{
NSLog(@"[%d,%d]",self.x,self.y);
}
@end
結(jié)構(gòu)體
?SPoint.h
typedef struct{
int x;
int y;
}SPoint;
////? main.m
#import#import "RPoint.h"
#import "SPoint.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//初始化對(duì)象。手動(dòng)分配內(nèi)存
RPoint *rp1=[[RPoint alloc] init];
rp1.x=10;
rp1.y=20;
[rp1 prints];
//再初始化一個(gè)對(duì)象
RPoint *rp2=rp1;
rp2.x=30;
rp2.y=40;
[rp2 prints];
[rp1 prints];
//指針存在 棧中,會(huì)復(fù)制一個(gè)棧出來,但是堆還是一個(gè)。值存在堆中。當(dāng)rp2和rp1指向的都是同一個(gè)堆。所以。rp2改變的時(shí)候。rp1也相應(yīng)改變。
//結(jié)構(gòu)體是值類型。直接存在棧上。
SPoint sp1;
sp1.x=11;
sp1.y=22;
NSLog(@"x=%d,y=%d",sp1.x,sp1.y);
SPoint sp2=sp1;
sp2.x=12;
sp2.y=23;
NSLog(@"x=%d,y=%d",sp2.x,sp2.y);
NSLog(@"x=%d,y=%d",sp1.x,sp1.y);
//結(jié)構(gòu)體,拷貝出來的是一個(gè)棧。所以他們的值不是一個(gè)。sp2更改后,對(duì)sp1沒有影響。
}
return 0;
}