類型系統
-
引用類型
- 類 class
- 指針 pointer
- 塊 block
-
值類型 value type
- 基礎數值類型
- 結構 struct
- 枚舉 enum
-
類型裝飾
- 協議 protocol
- 類別 category
- 擴展 extension
類 class VS. 結構 struct
-
類型與實例
- 類與對象
- 結構與值
-
類——引用類型
- 位于棧上的指針(引用)
- 位于堆上的實體對象
-
結構——值類型
- 實例直接位于棧中
-
空間分析
- 運行時內存圖
RPoint.h 接口
@interface RPoint: NSObject
/// 接口,繼承自NSObject
@property int x;//狀態
@property int y;
/// 屬性,里面放了一些數據程艷
-(void)print;//行為
///方法,簡單來說就是類內的函數
@end
類:
RPoint.h 實現
#import<Foundation/Foundation.h>
#import "rpoint.h"
@implementation RPoint
-(void)print{
NSLog(@"[%d,%d]",self.x,self.y);//self就是當前的實例
}
@end
在程序中
//創建對象
RPoint *rp1[[RPoint alloc] init];//對象都以指針形式存在,先進行動態內存分配,alloc是向系統請求內存分配,init進行初始化。
rp1.x=10;
rp1.y=20;
[rp1 print];//調用方法
結構
定義一個結構SPoint.h
typedef struct{
int x;
int y;
}Spoint;
結構中不能再加入方法。
在程序中創建一個結構的實例
Spoint sp1;
sp1.x=10;
sp1.y=20;
對象的空間分析
對象的空間分析.png
值的空間分析
值的空間分析
棧和堆的區別
棧和堆.png
在程序中行為上的區別
拷貝
RPoint *rp2=rp1;
rp2.x++;
rp2.y++;
[rp1 print];
[rp2 print];
Spoint sp2=sp1;
sp2.x++;
sp2.y++;
NSLog(@"[d%,d%]"sp1.x,sp1.y);
NSLog(@"[d%,d%]"sp2.x,sp2.y);
rp1和rp2同時被更改,而sp2的更改對sp1無影響
拷貝行為.png