運行時(runtime)是OC在運行時的一些機(jī)制和特性究抓,包括動態(tài)類型屋灌,動態(tài)綁定邪财,動態(tài)加載陕壹。運行時系統(tǒng)指的是實現(xiàn)OC動態(tài)特性的底層C語言庫质欲。
為什么說OC是動態(tài)語言:因為在OC中,數(shù)據(jù)類型的確定和方法的調(diào)用都從編譯時推遲到了運行時糠馆。動態(tài)類型如id類型(用了id類型要做判斷isKindOfClass再去接收數(shù)據(jù)和調(diào)用方法嘶伟,避免crash);動態(tài)綁定如@selector/SEL,
(2)動態(tài)綁定
動態(tài)綁定(dynamic binding)貌似比較難記憶又碌,但事實上很簡單九昧,只需記住關(guān)鍵詞@selector/SEL即可。OC跳過編譯階段毕匀,用SEL變量在運行時動態(tài)綁定一個方法铸鹰。SEL變量是存儲方法編號的整數(shù),通過整數(shù)來查找方法速度更快期揪,@selector()就是取類方法的ID掉奄。
2. 屬性( @property )與成員變量(ivar)的關(guān)系 :
屬性對成員變量擴(kuò)充了存取方法 . 屬性默認(rèn)會生成帶下劃線的成員變量 .
歷史: ?早期要手寫成員變量的存取方法, ?后來可以用 @synthesize 關(guān)鍵字自動合成成員變量的存取方法. 現(xiàn)在用@property關(guān)鍵字就能同時生成存取方法和帶下劃線的成員變量.
?注: @dynamic 關(guān)鍵字是告訴編譯器在運行時手動來實現(xiàn)成員變量的存取方法 , @synthesize 是讓 Xcode 自動生成 .
3. CoreAnimation 和 CoreGraphics這兩個框架的區(qū)別
CoreGraphics是底層繪制框架,我們實際會用到的也就是CG開頭的一些底層繪制函數(shù)和變量凤薛,這是一個純C語言框架姓建。
QuartzCore是包含了CoreAnimation的框架,是iOS系統(tǒng)的基本渲染框架缤苫,是一個OC語言框架速兔,是一套基于CoreGraphics的OC語言封裝,封裝出了基本渲染類CALayer活玲。
4. 面向?qū)ο笥心男┨卣饕约澳銓@些特征的理解涣狗。
繼承:子類繼承父類, 也會把父類的屬性,方法,協(xié)議一起繼承. 可以讓類之間產(chǎn)生聯(lián)系, 簡化代碼.
封裝:封裝是把數(shù)據(jù)和操作數(shù)據(jù)的方法對外隱藏,對外只公開接口舒憾。外界調(diào)用接口(方法)就能實現(xiàn)功能,但不必知道內(nèi)部如何實現(xiàn), 可以保證數(shù)據(jù)安全性, 而且更加面向?qū)ο? 我們在類中編寫的方法就是對實現(xiàn)細(xì)節(jié)的一種封裝镀钓;我們編寫一個類就是對數(shù)據(jù)和數(shù)據(jù)操作的封裝。
多態(tài)性:多態(tài)性是指允許不同子類型的對象對同一消息作出不同的響應(yīng)镀迂。簡單的說就是用同樣的對象引用調(diào)用同樣的方法但是做了不同的事情丁溅。分為編譯時的多態(tài)性和運行時的多態(tài)性。方法重載(overload)實現(xiàn)的是編譯時的多態(tài)性(也稱為前綁定)探遵,而方法重寫(override)實現(xiàn)的是運行時的多態(tài)性(也稱為后綁定)窟赏。要實現(xiàn)多態(tài)需要做兩件事:1. 方法重寫(子類重寫父類中已有的或方法);2. 對象造型(用父類指針指向子類)箱季。
抽象:抽象是將一類對象的共同特征抽象成一個類涯穷,包括數(shù)據(jù)抽象和行為抽象兩方面。只關(guān)注對象有的屬性和行為藏雏,不關(guān)注細(xì)節(jié)拷况。
5. 為什么說OC是動態(tài)運行時語言?
因為在OC 中, 通過自身的多態(tài)特性和底層運行時系統(tǒng), 把數(shù)據(jù)類型的確定和函數(shù)綁定由編譯時推遲到了運行時.(對比C++在編譯時就將函數(shù)名進(jìn)行綁定, OC把某些編譯時報錯延遲到運行時) ?簡單來說, 運行時機(jī)制使我們知道程序運行時才確定一個對象的類型,以及調(diào)用對象的哪個方法,?
6. atomic 和 nonatomic?
1. 定義:? atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作。
3. 對比: (1)前者讀寫慢, 更安全,? 后者讀寫快, 不安全.? (2)Mac OS 用前者, iOS 用后者居多。
2. 由來: ?一種線程保護(hù)技術(shù)(加鎖, 但不絕對安全)赚瘦, 屬性寫值未完成時, ?其他線程無法讀取最疆,避免數(shù)據(jù)讀取錯誤。這種機(jī)制耗性能蚤告,所以在iPhone上站粟,如沒有使用多線程間的通訊編程狸眼,那么用nonatomic聲明屬性(OC默認(rèn)atomic是因為mac平臺也用OC寫)陆赋。
4. 原理: 簡單來說朋腋,就是 atomic 會加一個鎖來保障線程安全授滓,并且引用計數(shù)會 +1地技,來向調(diào)用者保證這個對象會一直存在真屯。假如不這樣做誊役,如有另一個線程調(diào) setter笼踩,可能會出現(xiàn)線程競態(tài)逗爹,導(dǎo)致引用計數(shù)降到0,原來那個對象就釋放掉了嚎于。但是在這種加鎖機(jī)制下, 只能說屬性是讀/寫安全的掘而,但并不是線程安全的,因為別的線程還能進(jìn)行讀寫之外的其他操作于购。線程安全需要開發(fā)者自己來保證袍睡。
7. 簡述NotificationCenter、KVC肋僧、KVO斑胜、Delegate? 并說明它們之間的區(qū)別? (重點)
1.?KVO(Key-Value- Observing):一對多的觀察者模式, 提供了觀察對象某一屬性變化的方法,極大簡化了代碼嫌吠。
2. KVC(Key-Value-Coding):是鍵值編碼, 一個對象在調(diào)用setValue的時候止潘,檢查是否存在相應(yīng)key的set方法,存在就調(diào)用set方法, 不存在就查找_key的成員變量是否存在 --> 存在就直接賦值, 不存在就查找相同名稱的key. ? --> 存在就賦值, ?沒有就調(diào)用valueForUndefinedkey和setValue:forUndefinedKey辫诅。
3. Delegate: 直接的一對一關(guān)系凭戴。代理的目的是改變或傳遞控制鏈。允許一個類在某些特定時刻通知到其他類泥栖,而不需要獲取到那些類的指針簇宽。可以減少框架復(fù)雜度吧享。消息的發(fā)送者(sender)告知接收者(receiver)某個事件將要發(fā)生魏割,delegate同意然然后發(fā)送者響應(yīng)事件,delegate機(jī)制使得接收者可以改變發(fā)送者的行為钢颂。
4. Notification: 觀察者模式, 間接的多對多關(guān)系钞它。 A(通知中心單例)發(fā)送通知,B(任意對象)收到通知開始做事情(調(diào)用新方法或者block), ?但是B并不能反過來影響A的行為。
對比:?效率肯定是delegate比NSNotification高遭垛。
delegate方法比notification更加直接尼桶,需要關(guān)注返回值,所以delegate方法往往包含should這個很傳神的詞锯仪。相反的泵督,notification最大的特色就是不關(guān)心結(jié)果。所以notification往往用did這個詞匯庶喜。兩個模塊之間聯(lián)系不是很緊密小腊,就用notification傳值,例如多線程之間傳值用notificaiton久窟。
delegate只是一種較為簡單的回調(diào)秩冈,且主要用在一個模塊中,例如底層功能完成了斥扛,需要把一些值傳到上層去入问,就事先把上層的函數(shù)通過delegate傳到底層,然后在底層call這個delegate稀颁,它們都在一個模塊中芬失,完成一個功能,例如說 NavgationController 從 B 界面到A 點返回按鈕 (調(diào)用popViewController方法),?就用delegate峻村。
8. 懶加載
1. 懶加載:用到某個對象時再進(jìn)行初始化, 就是重寫get方法, 也叫延時加載麸折。舉例: tableView中圖片的加載顯示, 避免內(nèi)存過高。
2. 異步加載:開啟子線程處理耗時操作粘昨,比如加載網(wǎng)絡(luò)圖片垢啼、音頻, 避免阻塞主線程使得界面卡頓张肾。
9. OC有沒有多繼承芭析? 沒有的話有什么替代方法?
沒有吞瞪, 可以用分類和協(xié)議來代替馁启。
protocol(協(xié)議)可以實現(xiàn)多個接口,通過實現(xiàn)多個接口可以完成多繼承;
Category(類別)一般使用分類,用Category去重寫類的方法,僅對本Category有效,不會影響到其他類與原有類的關(guān)系。
10. 分別描述分類(categories)和延展(extensions)是什么? 以及兩者的區(qū)別? 繼承和分類在實現(xiàn)中有何區(qū)別? 為什么Category只能為對象添加方法, 卻不能添加成員變量?
1. 定義:(1)分類(categories): 在沒有原類.m文件的基礎(chǔ)上, 新建分類文件給本類添加方法; (2)延展(extensions):?分類的特例, 直接在類的.m文件里給類添加私有方法和私有變量芍秆。
2. 分類和延展的區(qū)別:?延展可以添加屬性惯疙,是一個私有分類。分類只能添加方法, 添加屬性妖啥。
3. 分類和繼承在實現(xiàn)中的區(qū)別:當(dāng)類別有和本類中同名的方法, 則類別將覆蓋本類方法, 因為類別具有更高的優(yōu)先級霉颠。繼承可以增加,修改刪除方法荆虱,添加屬性蒿偎。
4. 分類只能為對象添加方法, 卻不能添加成員變量的原因: 如果可以添加成員變量,添加的成員變量沒有辦法初始化朽们。
11. Objective-C有私有方法么? 私有變量呢? 如果沒有,有什么代替的方法?
沒有真正的私有方法,objective-c類里面的方法只有兩種, 類方法和對象方法诉位。但是可以通過把方法的聲明和定義都放在.m文件中來實現(xiàn)一個表面上的私有方法骑脱,但是通過運行時系統(tǒng)可以調(diào)用任何方法。有私有變量, 可以通過@private來修飾,或者把成員變量聲明放到.m文件中苍糠,使其成為私有變量叁丧。在Objective‐C中,所有實例變量默認(rèn)都是私有的, 所有實例方法默認(rèn)都是公有的。
12. include和#import的區(qū)別岳瞭? @class和#import的區(qū)別歹袁?
(1)import指令是OC針對C中的#include指令的改進(jìn)版本, 避免交叉包涵,交叉編譯寝优;
(2)#import鏈接了該頭文件的全部信息,包括方法和屬性枫耳,而@class只是告訴編譯器其后申明一個類乏矾,避免編譯報錯,不用關(guān)心類中細(xì)節(jié)迁杨。一般.h中用@class钻心, .m文件中用#import。
13. Objective-C與C铅协、C+++之間的聯(lián)系和區(qū)別捷沸?
Objective-C和C++都是C的面向?qū)ο蟮某?/b>。
Object與C++的區(qū)別主要點:Objective-C是完全動態(tài)的狐史,支持在運行時動態(tài)類型決議(dynamic typing)痒给,動態(tài)綁定(dynamic binding)以及動態(tài)裝載(dynamic loading);而C++是部分動態(tài)的骏全,編譯時靜態(tài)綁定苍柏,通過嵌入類(多重繼承)和虛函數(shù)(虛表)來模擬實現(xiàn)。
Objective-C 在語言層次上支持動態(tài)消息轉(zhuǎn)發(fā)姜贡,其消息發(fā)送語法為 [object function]试吁; 而且C++ 為 object->function()。 兩者的語義也不同楼咳,在 Objective-C 里是說發(fā)送消息到一個對象上熄捍,至于這個對象能不能響應(yīng)消息以及是響應(yīng)還是轉(zhuǎn)發(fā)消息都不會 crash; 而在 C++ 里是說對象進(jìn)行了某個操作母怜,如果對象沒有這個操作的話余耽,要么編譯會報錯(靜態(tài)綁定),要么程序會 crash 掉的(動態(tài)綁定)糙申。
14. 目標(biāo)-動作機(jī)制
目標(biāo):接收事件反饋的id類型的對象宾添。在代碼中通常用target來表示目標(biāo)對象船惨。
動作:事件反饋將觸發(fā)的方法。動作對象為SEL類型缕陕,代表一個方法粱锐。
SEL類型是OC語言為存儲方法名創(chuàng)造的變量類型。同時還創(chuàng)造了一個運算符扛邑,用于把一個方法名轉(zhuǎn)換成一個SEL值怜浅。
SEL test = @selector(方法名);
應(yīng)用場景:能夠設(shè)置反饋目標(biāo)和反饋動作的組件我們稱為具有目標(biāo)動作回調(diào)接口的組件,如UI控件蔬崩。
15. Objective-C優(yōu)點和缺點
優(yōu)點:(1).Category和Extension(實用的擴(kuò)展機(jī)制恶座,為類添加方法和屬性);
(2). 動態(tài)語言(動態(tài)類型識別沥阳,動態(tài)綁定跨琳,動態(tài)加載功能);
(4). 方便的通過操作指針來操作對象桐罕;
(5). C語言超集脉让,上手快,混編功炮。
缺點: (1).不支持命名空間(所以蘋果類庫都要帶一些奇怪的UI溅潜,NS前綴);
(3).不支持多重繼承 薪伏;
(4).運行時特性讓方法調(diào)用跳過編譯時, 用不到編譯時優(yōu)化方法(如內(nèi)聯(lián)函數(shù)等), 影響性能滚澜。
16. C語言的函數(shù)調(diào)用和oc的消息機(jī)制有什么區(qū)別?
C語言的函數(shù)調(diào)用在編譯時就決定調(diào)用哪個函數(shù),編譯后直接按順序執(zhí)行嫁怀。
OC的消息機(jī)制是一個動態(tài)調(diào)用過程设捐,決定調(diào)用哪個函數(shù)從編譯時延遲到運行時。(在編譯時并不能決定真正調(diào)用哪個函數(shù)塘淑。事實證明挡育,在編譯階段,OC可以調(diào)用任何函數(shù)朴爬,即使這個函數(shù)并未實現(xiàn)即寒,只要申明過就不會報錯。而C語言在編譯階段就會報錯召噩。只有在真正運行時才會根據(jù)函數(shù)的名稱找到對應(yīng)的函數(shù)來調(diào)用母赵。)
17. 什么是謂詞?
謂詞就是通過NSPredicate給定的邏輯條件作為約束條件,完成對數(shù)據(jù)的篩選具滴。
18. 常見的oc數(shù)據(jù)類型哪些凹嘲,和c的基本類型有啥區(qū)別?
常見的:NSInteger CGFloat NSString NSNumber NSArray NSDate
NSInteger根據(jù)32或者64位系統(tǒng)決定本身是int還是long构韵,CGFloat根據(jù)32或者64位系統(tǒng)決定本身是float還是double
NSString NSNumber NSArray NSDate是對象周蹭,存儲在堆中趋艘,c語言中的char int是一定字節(jié)的內(nèi)存空間,用于存儲數(shù)據(jù)凶朗,存儲在棧中瓷胧。
19. id和nil代表什么?
id類型的指針可以指向任何OC對象
nil代表空值(空指針的值棚愤,0)搓萧,在Objective-C中,nil對象調(diào)用任何方法表示什么也不執(zhí)行宛畦,也不會崩潰瘸洛。
20. nil和NULL的區(qū)別?
nil表示對象的指針(即對象的引用)為空次和;
null表示指向基本數(shù)據(jù)類型變量 (即c語言變量)的指針為空
注意:在MRC中可互換反肋,ARC中 普通指針和對象引用被嚴(yán)格限制,不能互換踏施!
NULL是宏囚玫,是對于C語言指針而使用的,表示空指針
nil是宏读规,是對于Objective-C中的對象而使用的,表示對象為空
Nil是宏燃少,是對于Objective-C中的類而使用的束亏,表示類指向空
NSNull是類類型,是用于表示空的占位對象阵具,與JS或者服務(wù)端的null類似的含意
21.向一個nil對象發(fā)送消息會發(fā)生什么碍遍?
向nil發(fā)送消息是有效的,只是在運行時不會有任何作用阳液。
如果一個方法返回值是一個對象怕敬、指針或結(jié)構(gòu)體,那么發(fā)送給nil的消息將返回0(nil)帘皿,如果返回值不是上述情況东跪,那么發(fā)送給nil的消息的返回值將是未定義的。(如果方法返回值為指針類型鹰溜,其指針大小為小于或者等于sizeof(void*)虽填,float,double曹动,long double 或者long long的整型標(biāo)量斋日,發(fā)送給nil的消息將返回0。如果方法返回值為結(jié)構(gòu)體墓陈,正如在《Mac OS X ABI 函數(shù)調(diào)用指南》恶守,發(fā)送給nil的消息將返回0第献。結(jié)構(gòu)體中各個字段的值將都是0。其他的結(jié)構(gòu)體數(shù)據(jù)類型將不是用0填充的兔港。)
22. self.和self->的區(qū)別庸毫?
self.是調(diào)用get或者set方法;self->是直接訪問成員變量
?前者通過成員變量的存取方法取值賦值押框,我們可以在兩個方法中過濾不合法的訪問岔绸,保證成員變量的封裝性;
后者隨意拿到成員變量賦值橡伞,不安全盒揉。而且后者對成員變量的訪問,要求成員變量是@public的兑徘,那么就暴露給外界了刚盈,也不安全。
23. 類方法和對象方法的區(qū)別和聯(lián)系挂脑?
類方法 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 實例方法
屬于類對象 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?屬于實例對象
只能類對象調(diào)用 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 只能實例對象調(diào)用
self指類對象 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??self指實例對象
類方法不能訪問成員變量 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 實例方法可以訪問成員變量
內(nèi)部不可直接調(diào)用對象方法(創(chuàng)建對象再調(diào)用) ? ? ? ? ? ? 內(nèi)部可直接調(diào)用類方法(通過類名)
24. _block/_weak修飾符區(qū)別藕漱?
(1)_block在arc和mrc環(huán)境下都能用,_weak只能在arc環(huán)境下使用崭闲。
(2)_block能修飾對象和基本數(shù)據(jù)類型肋联,_weak只能修飾對象。
(3)_block修飾的對象可以在block中重新賦值刁俭,_weak不行橄仍。
25. init和initWithObjc區(qū)別(語法)?
都是構(gòu)造方法牍戚,后者給屬性賦值侮繁。
26、@property的本質(zhì)是什么如孝?ivar宪哩、getter、setter是如何生成并添加到這個類中的第晰?
(1)@property的本質(zhì):@property = ivar(實例變量) + ?getter/setter(存取方法)锁孟。【“屬性” (property)有兩大概念:ivar(實例變量)、存取方法(access method = getter + setter)】茁瘦;
(2)ivar罗岖、getter、setter如何生成并添加到類中:
我們寫上@property + 屬性名腹躁,編譯器根據(jù)屬性名自動合成帶下劃線的ivar和getter/setter方法桑包,(默認(rèn)為@synthesize propertyName = _propertyName);
(3)拓展:1.?手寫@synthesize 屬性名 = _zhangsan,可以給成員變量改名成_zhangsan(一般不這么瞎搞纺非,應(yīng)保持系統(tǒng)默認(rèn)做法)哑了;2. 手寫getter/setter方法赘方,則不會有生成成員變量。
27. 這個寫法會出什么問題:@property (copy) NSMutableArray *array ?
第一, 沒注明nonatomic弱左,會影響性能窄陡。(沒有指明為nonatomic,就是默認(rèn)的atomic原子操作拆火,會在創(chuàng)建屬性時生成一些額外的代碼用于加鎖跳夭,保證線程安全,這會帶來性能問題们镜。通過聲明nonatomic可以節(jié)省這些雖然很小但是不必要額外開銷币叹。iOS中幾乎都是使用nonatomic來聲明的,因為使用atomic也并不能保證絕對的線程安全模狭,對于要絕對保證線程安全的操作颈抚,還需要使用更高級的方式來處理,比如NSSpinLock嚼鹉、@syncronized等)
第二贩汉,copy一個可變數(shù)組將會得到一個不可變數(shù)組。如果對copy出來的數(shù)組進(jìn)行增刪改操作锚赤,會crash匹舞。
28. @protocol和category中怎么使用 @property ?
在protocol中使用@property只會生成setter和getter方法聲明线脚,并要求遵守協(xié)議的對象能實現(xiàn)該屬性赐稽;
category使用@property只會生成setter和getter方法的聲明,如果要給category增加屬性的實現(xiàn)酒贬,需要借助于運行時的兩個函數(shù):objc_setAssociatedObject,objc_getAssociatedObject翠霍。
29. @property中有哪些屬性關(guān)鍵字锭吨?
原子性 (atomic,nonatomic)
讀寫(readwrite, readonly)
內(nèi)存管理(assign, strong, weak, unsafe_unretained,copy)
重命名 getter寒匙、setter
30. 如何訪問并修改一個類的私有屬性零如?
通過KVC獲取,通過runtime訪問并修改私有屬性锄弱。
Objective-C 中考蕾,meta-class 指的是什么?
meta-class 是類對象的類,為這個Class類存儲類方法,當(dāng)一個類發(fā)送消息時,就去這個類對應(yīng)的meta-class中查找那個消息,每個Class都有不同的meta-class,所有的meta-class都使用基類的meta-class(假如類繼承NSObject,那么他所對應(yīng)的meta-class也是NSObject)作為他們的類
對于語句NSString *obj = [[NSData alloc] init]; 会宪,編譯時和運行時obj分別是什么類型肖卧?
編譯時是NSString類型 ,運行時是NSData類型.
@synthesize和@dynamic分別有什么作用掸鹅?
- @property有兩個對應(yīng)的詞塞帐,一個是 @synthesize拦赠,一個是 @dynamic。如果 @synthesize和 @dynamic都沒寫葵姥,那么默認(rèn)的就是@syntheszie var = _var;
- @synthesize 的語義是如果你沒有手動實現(xiàn) setter 方法和 getter 方法荷鼠,那么編譯器會自動為你加上這兩個方法。
- @dynamic 告訴編譯器:屬性的 setter 與 getter 方法由用戶自己實現(xiàn)榔幸,不自動生成允乐。(當(dāng)然對于 readonly 的屬性只需提供 getter 即可)。假如一個屬性被聲明為 @dynamic var削咆,然后你沒有提供 @setter方法和 @getter 方法牍疏,編譯的時候沒問題,但是當(dāng)程序運行到 instance.var = someVar态辛,由于缺 setter 方法會導(dǎo)致程序崩潰麸澜;或者當(dāng)運行到 someVar = var 時,由于缺 getter 方法同樣會導(dǎo)致崩潰奏黑。編譯時沒問題炊邦,運行時才執(zhí)行相應(yīng)的方法,這就是所謂的動態(tài)綁定熟史。
NSString 的時候用copy和strong的區(qū)別馁害?
簡言之,copy修飾NSString會多一次判斷蹂匹,strong則不會碘菜,如果NSString很多,性能差限寞。(OC中NSString為不可變字符串的時候忍啸,用copy和strong都是只分配一次內(nèi)存,但是如果用copy的時候履植,需要先判斷字符串是否是不可變字符串计雌,如果是不可變字符串,就不再分配空間玫霎,如果是可變字符串才分配空間凿滤。如果程序中用到NSString的地方特別多,每一次都要先進(jìn)行判斷就會耗費性能庶近,影響用戶體驗翁脆,用strong就不會再進(jìn)行判斷,所以鼻种,不可變字符串可以直接用strong反番。)
NSArray、NSSet、NSDictionary與NSMutableArray恬口、NSMutableSet校读、NSMutableDictionary的特性和作用(遇到copy修飾產(chǎn)生的變化)
特性:
NSArray表示不可變數(shù)組,元素有序祖能,只能存對象歉秫,可通過下標(biāo)訪問元素,而且元素類型可以不一樣养铸,但是不能進(jìn)行增雁芙、刪、改操作钞螟;NSMutableArray是可變數(shù)組兔甘,能進(jìn)行增、刪鳞滨、改操作洞焙。通過索引查詢值很快,但是插入拯啦、刪除等效率很低澡匪。(數(shù)組用于處理一組有序的數(shù)據(jù)集,比如常用的tableview的dataSource要求有序褒链,可通過索引直接訪問唁情,效率高。)
NSSet表示不可變集合甫匹,具有確定性甸鸟、互異性、無序性的特點兵迅,只能訪問而不能修改集合抢韭;NSMutableSet表示可變集合,可以對集合進(jìn)行增恍箭、刪刻恭、改操作。集合通過值查詢很快季惯,插入吠各、刪除操作極快臀突。
集合在iOS開發(fā)中比較少用勉抓,多點觸控時的多個UITouch對象就是NSSet形式存在的。
字典是鍵值對數(shù)據(jù)集候学,值是無序的藕筋。JSON轉(zhuǎn)字典,字典轉(zhuǎn)模型就是其中一種應(yīng)用梳码。
weak和assign區(qū)別隐圾?
weak:一般修飾控件伍掀,代表指向?qū)ο蟮氖侨踔羔槪糜嫈?shù)不會+1暇藏,指向的對象銷毀時指針自動清空蜜笤;
assign,一般修飾int float double等基本數(shù)據(jù)類型盐碱,引用計數(shù)不會+1把兔,指向的對象銷毀時指針不會清空;
frame和bounds的區(qū)別瓮顽?
frame以父控件左上角為坐標(biāo)原點县好,bounds以自己的左上角為坐標(biāo)原點。兩者都是描述一塊區(qū)域的可視范圍暖混。前者決定自己在父控件中的位置缕贡,后者決定子控件在自己中的位置。