一、基本數(shù)據(jù)類型
注:OC沒有自己的基本類型主籍,只是對C的類型做了映射习贫,在32位的情況下相當(dāng)于int,大小4字節(jié)千元,在64位上相當(dāng)于long苫昌,大小8字節(jié);CGFloat同理幸海,在32位上相當(dāng)于float祟身,大小4字節(jié),在64位上相當(dāng)于double物独,大小8字節(jié)袜硫;對于BOOL類型有點(diǎn)特殊,0為false挡篓,非0為true婉陷,大小占4字節(jié)。
二、OC 結(jié)構(gòu)體類型?
CGRect憨攒、CGSize世杀、CGPoint
用來描述視圖位置主要用于UI&動(dòng)畫實(shí)現(xiàn),可與NSValue進(jìn)行轉(zhuǎn)換
二肝集、 對象數(shù)據(jù)類型
?id瞻坝、NSObject、NSSet杏瞻、NSArray所刀、NSDictionary、NSString捞挥、NSNumber浮创、NSValue
(1)id與NSObject
? ? ? ? ? id是一種通用的對象類型,可以且僅可以存儲對象類型砌函,動(dòng)態(tài)數(shù)據(jù)類型斩披,運(yùn)行時(shí)決定,編譯時(shí)不做檢查讹俊,不需要強(qiáng)制類型轉(zhuǎn)換
? ? ? ? ? NSObject也指向任何對象類型垦沉,靜態(tài)數(shù)據(jù)類型,編譯時(shí)會(huì)做檢查仍劈,所以需要強(qiáng)制類型轉(zhuǎn)換
(2)id與instancetype
? ? ? ? ? id可以定義變量厕倍,聲明函數(shù)參數(shù)與返回值類型,instancetype一般作為初始化函數(shù)返回類型贩疙,編譯時(shí)期會(huì)做函數(shù)返回值類型校驗(yàn)讹弯,警告提示
(3)NSString
? ? ????NSString內(nèi)部封裝了三種類型 ?__NSCFConstantString ? ? ?__NSCFString ? ? ? ?NSTaggedPointerString
? ??????__NSCFConstantString 常量字符串,不可變这溅,分配在常量區(qū)组民,相同字符串常量公用一個(gè),可通過 == 或者字符串方式比較悲靴,不遵循引用計(jì)數(shù)內(nèi)存管理機(jī)制臭胜,引用計(jì)數(shù) -1,非對象
????????__NSCFString 字符串變量对竣,分配在堆區(qū)庇楞,遵循引用計(jì)數(shù)內(nèi)存管理機(jī)制榜配,對象
????NSTaggedPointerString 對于長度較小無中文漢字的字符串否纬,蘋果采用的內(nèi)存優(yōu)化方式,不遵循引用計(jì)數(shù)內(nèi)存管理機(jī)制蛋褥,引用計(jì)數(shù) -1临燃,非對象,存儲在棧區(qū)
(4)NSMutableDictionary
? ? ? ? 底部實(shí)現(xiàn)原理是一個(gè)哈希表膜廊,對鍵名key做哈希運(yùn)算生成一個(gè)不小于零的數(shù)字,用該結(jié)果數(shù)字對實(shí)際存儲元素個(gè)數(shù)取余爪瓜,存儲在當(dāng)前的index蹬跃,由于key字符串?dāng)?shù)量繁多铆铆,而數(shù)組大小有限,就會(huì)造成計(jì)算出來的取余結(jié)果一樣薄货,出現(xiàn)哈希沖突翁都。
? ? ? ? 哈希沖突容易出現(xiàn)存在兩點(diǎn)原因谅猾,負(fù)載因子(總數(shù)據(jù)個(gè)數(shù)與可存儲元素個(gè)數(shù)比值)過大,或者哈希函數(shù)存在問題税娜。
? ? ? ? 解決的方法有 拉鏈法坐搔、開發(fā)定址法、再哈希法巧涧、公共溢出區(qū)等薯蝎,目前蘋果為了查找時(shí)間復(fù)雜度為O(1),采用的是開放定址法谤绳。
(5)NSMutableArray
? ? ? ? 實(shí)現(xiàn)原理是一個(gè)基本數(shù)組占锯,維數(shù)組增加了起始地址、偏移地址缩筛、當(dāng)前數(shù)組大小和實(shí)際存儲元素個(gè)數(shù)等信息
? ? ? ??