类和结构体
==类和结构体关系==
OC中Class点进去看就是一个指向结构体的指针,在64位环境下占8个字节,所以NSObject在内存中就占8个字节,但是真正的的情况是系统分配占16个字节
共同点
- 定义属性用于储存值
- 定义方法用于提供功能
- 定义下标用于通过下标语法访问值
- 定义初始化器用于生成初始化值
- 通过扩展以增加默认实现的功能
- 符合协议以对某类提供标准功能
不同点
- struct作为数据结构的实现体,它默认的数据访问控制是public的,而class作为对象的实现体,它默认的成员变量访问控制是private的
- 所有的结构体都有一个自动生成的成员逐一构造器,用于初始化新结构体实例中成员的属性,然而类实例并没有默认的成员逐一构造器:
- 取消初始化器允许一个类实例释放任何其所被分配的资源
OC中的不同点
- 对象中的结构体属性中的属性是不允许作单独修改的,比如UIView的frame.size不可以直接被修改为CGSizeMake。但是当不用@property定义结构体,而是用public,通过->方式访问,就可以修改。
- 结构体只能封装数据 类可以封装行为
- 结构体和枚举是值类型(栈分配内存小,读取快) ,引用计数允许对一个类的多次引用,结构体总是通过被复制的方式在代码中传递
- 类型转换允许在运行时检查和解释一个类实例的类型
Swift中的不同点
- swift中结构体不能继承,c++里面结构体是可以继承的
- 类型转换允许在运行时检查和解释一个类实例的类型
- 初始化器使一个类的实例能够释放它所分配的任何资源。
- 结构体和枚举是值类型(栈分配内存小,读取快) ,引用计数允许对一个类的多次引用,结构体总是通过被复制的方式在代码中传递
什么时候用类,什么时候用结构体:
1:如果封装的这个数据,不仅有数据还有方法,只能使用类。
2:如果表示实体,没有行为,光有属性,结构体更方便。
结构体为什么在栈里:
结构体是值类型,是通过被复制的方式在代码中传递,如果在堆中,结构体数据量很大,拷贝的代价很大。栈的特点是空间小,读取快。
网友评论