1.类型系统
引用类型:类class 指针pointer 块block
值类型:基础数据类型(int double float)、结构struct、枚举 enum
类型装饰:协议protocol、类别category、扩展extension
2.类
首先要定义一个接口文件:
作用:描述对外调用
@interface RPoint:NSObject
//属性 数据成员 表达的是一个状态
@property int x;
@property int y;
//方法 表示的是对象的行为 -代表实例方法 返回值是void 无参数
-(void) print;
@end```
实现.m文件
@implementation RPoint
- (void)print
{
NSLog(@"[%d,%d]",self.x,self.y);//当前的实例对象
}
@end```
在main函数中调用
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
/*
创建一个对象实例 RPoint是一个类型 动态内存分配向系统请求->初始化会默认调用构造器 将x.y初始化为0
*/
RPoint *rp1 = [[RPoint alloc] init];
rp1.x = 10;
rp1.y = 20;
[rp1 print];//给对象发消息
SPoint sp1;//编译器直接定义内存大小
sp1.x = 10;
sp1.y = 20;
}
3.类VS结构
类叫做引用类型,结构叫做值类型,存储不同。
对象:栈上存储指针(引用),它指向堆上的对象
值:实例(值)内存直接存储于栈空间
4.栈(stack)VS 堆(heap)
理解栈和堆的区别与特点
栈:存储值类型
*无ARC的负担,由系统直接管理,以执行函数为单位
*空间大小编译时就已经确定了(参数+局部变量 sizeof)
*函数结束之后,系统立即回收
*函数之间通过拷贝值传递
*具有局部性,大小有限额,超出会stack overflow
堆:存储引用类型对象
*分配由程序员手动请求(创建时)
*释放时由ARC机制自动释放
*函数之间通过拷贝引用(指针)传递
*具有全局性,总体大小无限制
5.通过画UML内存图的方式,理解值类型与引用类型的区别。
曾看到这样比喻:值类型就是现金,要用直接用;引用类型是存折,要用还得先去银行取现。
- 声明一个值类型变量,编译器会在栈上分配一个空间,这个空间对应着该值类型变量,空间里存储的就是该变量的值。
- 引用类型的实例分配在堆上,新建一个引用类型实例,得到的变量值对应的是该实例的内存分配地址,这就像您的银行账号一样。
代码如下:
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];//给对象发消息 [10 20]
SPoint sp1;//编译器直接定义内存大小
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];
}