一、基本数据类型
注:OC没有自己的基本类型,只是对C的类型做了映射,在32位的情况下相当于int,大小4字节,在64位上相当于long,大小8字节;CGFloat同理,在32位上相当于float,大小4字节,在64位上相当于double,大小8字节;对于BOOL类型有点特殊,0为false,非0为true,大小占4字节。
二、OC 结构体类型
CGRect、CGSize、CGPoint
用来描述视图位置主要用于UI&动画实现,可与NSValue进行转换
二、 对象数据类型
id、NSObject、NSSet、NSArray、NSDictionary、NSString、NSNumber、NSValue
(1)id与NSObject
id是一种通用的对象类型,可以且仅可以存储对象类型,动态数据类型,运行时决定,编译时不做检查,不需要强制类型转换
NSObject也指向任何对象类型,静态数据类型,编译时会做检查,所以需要强制类型转换
(2)id与instancetype
id可以定义变量,声明函数参数与返回值类型,instancetype一般作为初始化函数返回类型,编译时期会做函数返回值类型校验,警告提示
(3)NSString
NSString内部封装了三种类型 __NSCFConstantString __NSCFString NSTaggedPointerString
__NSCFConstantString 常量字符串,不可变,分配在常量区,相同字符串常量公用一个,可通过 == 或者字符串方式比较,不遵循引用计数内存管理机制,引用计数 -1,非对象
__NSCFString 字符串变量,分配在堆区,遵循引用计数内存管理机制,对象
NSTaggedPointerString 对于长度较小无中文汉字的字符串,苹果采用的内存优化方式,不遵循引用计数内存管理机制,引用计数 -1,非对象,存储在栈区
(4)NSMutableDictionary
底部实现原理是一个哈希表,对键名key做哈希运算生成一个不小于零的数字,用该结果数字对实际存储元素个数取余,存储在当前的index,由于key字符串数量繁多,而数组大小有限,就会造成计算出来的取余结果一样,出现哈希冲突。
哈希冲突容易出现存在两点原因,负载因子(总数据个数与可存储元素个数比值)过大,或者哈希函数存在问题。
解决的方法有 拉链法、开发定址法、再哈希法、公共溢出区等,目前苹果为了查找时间复杂度为O(1),采用的是开放定址法。
(5)NSMutableArray
实现原理是一个基本数组,维数组增加了起始地址、偏移地址、当前数组大小和实际存储元素个数等信息