1.OC的動(dòng)態(tài)運(yùn)行時(shí)語(yǔ)言的原因
1)多態(tài)將數(shù)據(jù)類(lèi)型的確定由編譯時(shí),推遲到了運(yùn)行時(shí)
多態(tài):不同對(duì)象以自己的方式響應(yīng)相同的消息的能力
2.類(lèi)變量的@protected,@private,@public,@package的 聲明各有什么含義
主要是時(shí)類(lèi)成員的作用域不同;
1)@protected(自身類(lèi)和其子類(lèi),外界不可訪問(wèn),但是能繼承),系統(tǒng)默認(rèn)的類(lèi)變量聲明;
2)@private (自身類(lèi),外界既不能訪問(wèn),也不能繼承)
3)@public(可以在任何地方被訪問(wèn),外界既能訪問(wèn),又可以繼承)
4)@package(作用在某個(gè)框架內(nèi))
3.關(guān)于OC中的內(nèi)存管理機(jī)制,release與dealloc的區(qū)別? assign,retain,copy,nonatomic,atomic,strong,weak屬性的作用?
OC使用引用計(jì)數(shù)機(jī)制管理對(duì)象,當(dāng)對(duì)象使用了alloc,Mutable copy,retain時(shí),必須使用相對(duì)應(yīng)的realease或者autorelease(即自己生成的對(duì)象自己持有,不需要時(shí)自己釋放)?????????????????????????????????? 生成并持有對(duì)象(alloc,mutableCopy,retain)????????????????????????????
??????????????????????????????????????? 持有對(duì)象(retain)
??????????????????????????????????????? 釋放對(duì)象(release)
???????????????????????????????????????? 廢棄對(duì)象(dealloc)
nonatomic(不考慮線(xiàn)程安全);atomic(默認(rèn),考慮線(xiàn)程安全)
strong(默認(rèn)):ARC和MRC下retain一樣; weak?? ARC下和assin類(lèi)似,當(dāng)指向的內(nèi)存釋放掉時(shí)自動(dòng)置為空,防止野指針出現(xiàn)
4.應(yīng)用程序按home鍵進(jìn)入后臺(tái)時(shí)的生命周期? 從后臺(tái)回到前臺(tái)時(shí)的生命周期?
5.關(guān)于響應(yīng)鏈
6.如何優(yōu)化冒泡排序
7.實(shí)現(xiàn)離線(xiàn)發(fā)QQ
8.如圖
9.socket中TCP的三次握手
TCP:安全的協(xié)議蜕企,能保證數(shù)據(jù)順序和正確性,服務(wù)器和客戶(hù)端能隨時(shí)互發(fā)數(shù)據(jù)。如果服務(wù)器要主動(dòng)發(fā)送數(shù)據(jù)給客戶(hù)端,可以用這個(gè)協(xié)議
UDP:非安全的協(xié)議敬拓,容易丟失數(shù)據(jù)被冒,一般用于聯(lián)機(jī)對(duì)戰(zhàn)的游戲
XMPP:基于XML通訊的協(xié)議,基于TCP發(fā)送XML數(shù)據(jù)嫡意,一般用于即時(shí)通訊(比如QQ馏艾、微信)
HTTP:一般用于非實(shí)時(shí)連接的請(qǐng)求劳曹,只有客戶(hù)端主動(dòng)向服務(wù)器發(fā)送請(qǐng)求時(shí)奴愉,服務(wù)器才能返回?cái)?shù)據(jù)給客戶(hù)端
SOCKET:套接口,可以使用TCP/UDP/XMPP通訊
6.KVO的內(nèi)部實(shí)現(xiàn)基理(類(lèi)中的isa指針指向發(fā)生改變)
1>KVO是基于runtime機(jī)制實(shí)現(xiàn)的
2>當(dāng)某個(gè)子類(lèi)的對(duì)象第一次被觀察時(shí)铁孵,系統(tǒng)會(huì)在運(yùn)行期間動(dòng)態(tài)的創(chuàng)建該類(lèi)的一個(gè)派生類(lèi)躁劣,在這個(gè)派生類(lèi)中重寫(xiě)基類(lèi)中的任何被觀察屬性的setter方法。
派生類(lèi)在重寫(xiě)的setter方法中實(shí)現(xiàn)真正的通知機(jī)制(Person -> NSKVONotifying Person)
7.是否可以把比較耗時(shí)的操作放在NSNotificationCenter中库菲?
是否可以取決于我們要在哪里發(fā)送通知(因?yàn)榻邮芡ㄖ獣r(shí)執(zhí)行的方法所在線(xiàn)程和發(fā)送通知所在線(xiàn)程是一致的);
1>如果在異步線(xiàn)程發(fā)送通知志膀,那么可以在接收通知的方法中執(zhí)行比較耗時(shí)的操作熙宇;
2>如果在主線(xiàn)程中發(fā)送通知,那么就不能執(zhí)行比較耗時(shí)的操作溉浙;
8.runtime 的概念烫止?runtime的用法?
1> runtime是一套底層的C語(yǔ)言API(包含很多強(qiáng)大實(shí)用的C語(yǔ)言數(shù)據(jù)類(lèi)型戳稽、C語(yǔ)言函數(shù))
2> 實(shí)際上馆蠕,平時(shí)我們編寫(xiě)的OC代碼,底層都是基于runtime實(shí)現(xiàn)的
* 也就是說(shuō)惊奇,平時(shí)我們編寫(xiě)的OC代碼互躬,最終都是轉(zhuǎn)成了底層的runtime代碼(C語(yǔ)言代碼)
1> 能動(dòng)態(tài)產(chǎn)生一個(gè)類(lèi)、一個(gè)成員變量颂郎、一個(gè)方法
2> 能動(dòng)態(tài)修改一個(gè)類(lèi)吼渡、一個(gè)成員變量、一個(gè)方法
3> 能動(dòng)態(tài)刪除一個(gè)類(lèi)乓序、一個(gè)成員變量寺酪、一個(gè)方法
方法實(shí)例:動(dòng)態(tài)的修改系統(tǒng)方法
1>修改[UIImage ImageNamed:]的系統(tǒng)方法(使其能根據(jù)系統(tǒng)版本的不同,顯示不同的圖片)
2>重寫(xiě)NSMutableArray的addObject:方法替劈,使其在添加空對(duì)象的時(shí)候不會(huì)使程序崩潰寄雀;重寫(xiě)NSArray的ObjectAtIndex:方法,使其即使出現(xiàn)數(shù)組越界也不會(huì)發(fā)生崩潰陨献。
a)對(duì)交換系統(tǒng)方法和自定義方法的方法進(jìn)行封裝
b)重寫(xiě)系統(tǒng)方法并進(jìn)行交換
c)在ViewDidLoad中直接調(diào)用系統(tǒng)方法盒犹,runtime機(jī)制會(huì)在運(yùn)行時(shí)直接進(jìn)行類(lèi)方法和自定義方法的交換
9.父子控制器的重要性;
當(dāng)我們將其他控制器添加到主控制器時(shí)眨业,如果沒(méi)有確定主控制器與填入的控制器的復(fù)制關(guān)系阿趁,即:
[self.parentViewController? addChildViewController:childViewController]
則子控制器獲取不了主控制器的屏幕旋轉(zhuǎn)方法,也無(wú)法獲得主控制器的self.NavigationController 完成不了控制器之間的跳轉(zhuǎn)坛猪,因此當(dāng)將其他控制器添加到一個(gè)主控制器中時(shí)脖阵,確定子控制器與主控制器間的父子關(guān)系非常重要。
10.如果后期需要增加數(shù)據(jù)庫(kù)中的字段怎么實(shí)現(xiàn)墅茉,如果不使用CoreData呢命黔?
編寫(xiě)SQL語(yǔ)句來(lái)操作原來(lái)表中的字段
1>增加表字段
ALTER TABLE 表名 ADD COLUMN 字段名 字段類(lèi)型呜呐;
2>刪除表字段
ALTER TABLE 表名 DROP COLUMN 字段名;
3>修改表字段
ALTER TABLE 表名 RENAME COLUMN 舊字段名 TO 新字段名
11.關(guān)于tableview的優(yōu)化問(wèn)題
UITableView的優(yōu)化主要從三個(gè)方面入手:
1》提前計(jì)算并緩存好高度(布局)悍募,因?yàn)閔eightForRowAtIndexPath:是調(diào)用最頻繁的方法蘑辑;
2》異步繪制,遇到復(fù)雜界面坠宴,遇到性能瓶頸時(shí)洋魂,可能就是突破口;
3》滑動(dòng)時(shí)按需加載喜鼓,這個(gè)在大量圖片展示副砍,網(wǎng)絡(luò)加載的時(shí)候很管用!(SDWebImage已經(jīng)實(shí)現(xiàn)異步加載庄岖,配合這條性能杠杠的)豁翎。
除了上面最主要的三個(gè)方面外,還有很多幾乎大伙都很熟知的優(yōu)化點(diǎn):
1.正確使用reuseIdentifier來(lái)重用Cells
2.盡量使所有的viewopaque隅忿,包括Cell自身
3.盡量少用或不用透明圖層
4.如果Cell內(nèi)現(xiàn)實(shí)的內(nèi)容來(lái)自web心剥,使用異步加載,緩存請(qǐng)求結(jié)果
5.減少subviews的數(shù)量
6.在heightForRowAtIndexPath:中盡量不使用cellForRowAtIndexPath:背桐,如果你需要用到它优烧,只用一次然后緩存結(jié)果
7.盡量少用addView給Cell動(dòng)態(tài)添加View,可以初始化時(shí)就添加链峭,然后通過(guò)hide來(lái)控制是否顯示