一氓辣、 ?OC中的對象類型
OC中對于數(shù)據(jù)的處理都是采用將簡單的數(shù)據(jù)類型封裝成對象這種方式低剔,這和C語言就有很大的不同薛夜。
1.1 字符串類
? 在C語言中忌愚,我們知道沒有真正的字符串類型,一般是用數(shù)組去保存字符串却邓。但是在OC中硕糊,NSString這個類,用于對字符串進(jìn)行處理腊徙。
三種初始化方式:
1. 字面量初始化:?
NSString *str=@"hello world";
2. 初始化器方法:
NSString *str1=[[NSString alloc]initWithString:str];
NSString *str2=[[NSString alloc]initWithFormat:@"你好"];
3.工廠方法:
NSString *str3=[NSString stringWithFormat:@"大家好"];
不難發(fā)現(xiàn)NSString中存儲的是指針简十,其指向堆上的值。其實NSString已經(jīng)將字符封裝成了對象了撬腾。str不僅能調(diào)用堆上的值螟蝙,還能調(diào)用NSString類中的實例方法。
*在OC中NSString還有“共享機制”這種特殊的存儲規(guī)則民傻,其目的是減少內(nèi)存的使用胰默。其會將值想等的內(nèi)存共享給不同的對象。這樣做會引發(fā)幾條現(xiàn)象:
(1):有效減少內(nèi)存的占用漓踢;
(2):NSString中保存的值不會改變牵署。
?也就是說,當(dāng)使用工廠方法給 str賦新值的時候喧半,相當(dāng)于重寫賦予一個對象奴迅,而不是改變str指向的值。
如果要頻繁改變字符串的值挺据∪【撸可以使用NSMutableSring脖隶。其是NSString的子類。取消了共享機制暇检,并且增加了許多的類方法與實例方法方便開發(fā)者對值進(jìn)行操作产阱。
NSMutableString有一個特點需要注意,NSMutableString是動態(tài)的字符串块仆,其內(nèi)存大小在初始化后心墅,如果在使用中存儲的字符串超出了預(yù)定的內(nèi)存大小。NSMutableString將自動重寫分配一次內(nèi)存大小榨乎,其大小為原內(nèi)存的兩倍怎燥。重點是這種操作給予計算機的負(fù)擔(dān)特別大。會影響程序的效率蜜暑。
1.2 集合類
OC中有三種集合類铐姚。
NSArray類,是有序的數(shù)組肛捍。
NSSet類隐绵,是無序的集合類,并且不能存儲相同的集合元素拙毫。其規(guī)則和數(shù)學(xué)中的集合極為相似依许。
NSDictionary是鍵值對的存儲方式。
三種類均有對應(yīng)的Mutable子類缀蹄。
NSMutableArray超過預(yù)設(shè)的存儲大小峭跳,程序的效率會更低。這是因為在超過預(yù)定長度時缺前,編譯器會作三件事:(1) 分配新的堆內(nèi)存蛀醉,2倍于原內(nèi)存。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(2) 將原來堆內(nèi)存上的元素拷貝到新內(nèi)存
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(3) 釋放原來堆內(nèi)存
三種類都只能存儲對象衅码。如果要將簡單的數(shù)據(jù)類型存儲在集合中拯刁,必須封裝成類。
基本類型用NSNumber封裝逝段。結(jié)構(gòu)類型用NSValue封裝垛玻。
注意:三種集合類雖然具有長量性(長度和元素指針都不能更改)但是指針指向的對象內(nèi)部可以更改。
三種集合類的初始化方式和一些常用的類方法與實例方法就不在詳述奶躯。應(yīng)該自己下閱讀官方文檔帚桩,和進(jìn)行必要的練習(xí)。
內(nèi)存模型為:保存一個存儲在棧上的地址巫糙。這個地址指向堆上保存的所有對象的值地址朗儒。堆上的對象地址就是數(shù)組保存的值。
for in 是最快的內(nèi)存遍歷方法参淹!
二醉锄、ARC機制
? 是OC中的內(nèi)存管理機制,其作用相當(dāng)于Java中的垃圾回收機制浙值,但是和Java最大的不同是其是短時回收機制恳不,這就決定了OC跟適合運用于應(yīng)用軟件的開發(fā),而Java更適合做服務(wù)器的開發(fā)开呐。
ARC全稱為:Automatic Reference Counting(自動引用計數(shù)),ARC的出現(xiàn)將程序猿從繁復(fù)的內(nèi)存管理中解放出來⊙萄現(xiàn)在OC默認(rèn)開啟ARC。
ARC管理三種對象:1.OC對象指針筐付。2.Block指針卵惦。3.使用_attribute_((NSObject))定義的typedef
ARC不管理以下三種類型:1.值類型(簡單值類型,C語言struct)2.使用其它方式分配的堆對象(如使用malloc分配)3.非內(nèi)存資源
OC中當(dāng)ARC管理的對象引用計數(shù)為零的時候?qū)⒆詣颖会尫磐咂荩陆ㄒ粋€引用類型對象(alloc,new,copy)沮尿,引用計數(shù)將變?yōu)?,而以下四種操作將增加引用計數(shù):
(1) 將對象引用賦值給其它變量或常量较解。(2) 將對象已用賦值給其它屬性或?qū)嵗兞浚?)將對象傳遞給函數(shù)參數(shù)畜疾,或者返回值 (4)將對象加入集合中
以下四種操作將減少引用計數(shù):
(1)將局部變量或全局變量賦值為nil或其它值。(2) 將屬性賦值為nil或其它值印衔。 (3)實例屬性所在的對象被釋放啡捶。 (4)參數(shù)或局部變量離開函數(shù) (5) 將對象從集合中刪除
放于@AutoRelease Pool中的對象將會函數(shù)結(jié)束時自動釋放,@AutoRelease Pool可以嵌套使用奸焙,目的是創(chuàng)建大量對象后瞎暑,需要立即釋放。
三与帆、協(xié)議金顿、類別與擴展
3.1協(xié)議
在Xcode中Command+N,選擇Objective—C file,可以快速創(chuàng)建一個OC的協(xié)議鲤桥。
協(xié)議有如下特點:1.協(xié)議能繼承多個協(xié)議揍拆。2.協(xié)議只有.h文件,意味著茶凳,只能聲明方法和定義屬性嫂拴。并不能實現(xiàn)它們。3.一個類能同時遵守過個協(xié)議贮喧。
協(xié)議中默認(rèn)都是@require類型筒狠,其意味著這些屬性和方法必須在遵守協(xié)議的類中實現(xiàn)。但是寫在@optional下的屬性或方法可以選擇實現(xiàn)箱沦。
提示:可以用conformsToProtocol:檢查對象是否實現(xiàn)了協(xié)議辩恼。
以下協(xié)議是OC中經(jīng)常用到的官方協(xié)議,需要下來多學(xué)習(xí)與熟悉:
NSObject、NSCopying灶伊、NSMutableCopy疆前、NSFastEnumeration、NSCoding聘萨。
3.2 類別與擴展
類別和擴展都是為原有存在的類添加新的方法竹椒。但是兩者間有著較大的區(qū)別。
類別:能在不知道類的源文件的情況下為原有的類添加方法米辐,可以類方法也可以是實例方法胸完,但是不能添加成員變量和屬性。類別自身有獨立的.h和.m文件翘贮。并且能被子類繼承赊窥。命名規(guī)范為:類名+擴展名。類別有個功能是為特別大型的類進(jìn)行分割實現(xiàn)狸页。
擴展:必須知道類的源文件锨能。其沒有獨立的.h和.m文件。其接口和實現(xiàn)均寫在被擴展類的.m文件著肴捉,這意味著擴展中定義的實例變量和方法都是私有的腹侣。外部不能調(diào)用。只能在類內(nèi)中調(diào)用齿穗。