1戒洼、數(shù)組去重的方法:
(1)原來集合操作可以通過valueForKeyPath來實現(xiàn)的狂秦,去重可以一行代碼實現(xiàn)(順序不發(fā)生變化)
(2)利用NSDictionary去重,字典在設(shè)置key-value時,若已存在則更新值污它,若不存在則插入值绎速,然后獲取allValues虾啦。若不要求有序锰扶,則可以采用此種方法。若要求有序初家,還得進(jìn)行排序(使用sortedArrayusingcomparator)
(3)利用集合NSSet的特性(確定性偎窘、無序性、互異性)溜在,放入集合就自動去重了陌知。但是它與字典擁有同樣的無序性,所得結(jié)果順序不再與原來一樣炕泳。如果不要求有序纵诞,使用此方法與字典的效率應(yīng)該是差不多的
(4)[NSOrderedset orderedsetwitharray:arr].array?
2上祈、runtime培遵,runloop,block登刺,kvo籽腕,kvc,gcd 底層原理纸俭、 iOS編譯原理皇耗,編譯流程、發(fā)起一次http或者h(yuǎn)ttps的整個流程
3揍很、iOS Runtime的實際應(yīng)用
1)動態(tài)給分類添加屬性 2)方法的交換swizzling 3)字典轉(zhuǎn)模型4)獲取所有的私有屬性和方法5)對私有屬性修改6)歸檔:解檔7)動態(tài)的添加方法
4郎楼、一次完整的HTTP請求過程
對www.baidu.com這個網(wǎng)址進(jìn)行DNS域名解析,得到對應(yīng)的IP地址
根據(jù)這個IP窒悔,找到對應(yīng)的服務(wù)器呜袁,發(fā)起TCP的三次握手
建立TCP連接后發(fā)起HTTP請求
服務(wù)器響應(yīng)HTTP請求,瀏覽器得到html代碼
瀏覽器解析html代碼简珠,并請求html代碼中的資源(如js阶界、css、圖片等)(先得到html代碼,才能去找這些資源)
瀏覽器對頁面進(jìn)行渲染呈現(xiàn)給用戶
服務(wù)器關(guān)閉關(guān)閉TCP連接
5膘融、KVO
當(dāng)某個類的實例對象的key第一次被觀察時芙粱,系統(tǒng)就會在運行期動態(tài)地
創(chuàng)建該類的一個派生類NSKVONotifying_類名,
在這個派生類中重寫該類中被觀察的屬性的 setter 方法氧映。
5.1 當(dāng)調(diào)用addObserver函數(shù)的時候春畔,系統(tǒng)運行時自動幫你把Animal類替換為了 NSKVONotifying_Animal類,同時重寫了set方法岛都,當(dāng)我們查看addObserver函數(shù)的時候拐迁,可以看到該函數(shù)在NSObject分類下@interfaceNSObject(NSKeyValueObserverRegistration)
作者:roger_Hunter
鏈接:http://www.reibang.com/p/91c41292b5b9
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)疗绣,非商業(yè)轉(zhuǎn)載請注明出處线召。
6、Runtime 的作用
Objc 在三種層面上與 Runtime 系統(tǒng)進(jìn)行交互:
通過 Objective-C 源代碼
通過 Foundation 框架的 NSObject 類定義的方法
通過對 Runtime 庫函數(shù)的直接調(diào)用
作者:sheldon_龍
鏈接:http://www.reibang.com/p/735a9ed7062f
來源:簡書
著作權(quán)歸作者所有多矮。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)缓淹,非商業(yè)轉(zhuǎn)載請注明出處。
7塔逃、__weak?在指向的內(nèi)存銷毀后讯壶,可以將指針變量置為?nil,這樣更加安全湾盗。
1伏蚊、初始化時:runtime會調(diào)用objc_initWeak函數(shù),初始化一個新的weak指針指向?qū)ο蟮牡刂贰?/p>
2格粪、添加引用時:objc_initWeak函數(shù)會調(diào)用objc_storeWeak()函數(shù)躏吊,objc_storeWeak()的作用是更新指針指向,創(chuàng)建對應(yīng)的弱引用表帐萎。
3比伏、釋放時,調(diào)用clearDeallocating函數(shù)疆导。clearDeallocating函數(shù)首先根據(jù)對象地址獲取所有weak指針地址的數(shù)組赁项,然后遍歷這個數(shù)組把其中的數(shù)據(jù)設(shè)為nil,最后把這個entry從weak表中刪除澈段,最后清理對象的記錄悠菜。
作者:Liberalism
鏈接:http://www.reibang.com/p/0d7dfb5093a8
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)败富,非商業(yè)轉(zhuǎn)載請注明出處悔醋。
8、如何打破循環(huán)引用囤耳?
注意變量作用域篙顺,使用?autorelease?讓編譯器來處理引用偶芍。
使用弱引用(__weak)。
當(dāng)實例變量完成工作后德玫,將其置為?nil匪蟀。
9、autoReleasePool什么時候釋放?
App啟動后宰僧,蘋果在主線程RunLoop里注冊了兩個Observer材彪,其回調(diào)都是_wrapRunLoopWithAutoreleasePoolHandler()。
第一個Observer監(jiān)視的事件是Entry(即將進(jìn)入Loop)琴儿,其回調(diào)內(nèi)會調(diào)用_objc_autoreleasePoolPush()創(chuàng)建自動釋放池段化。其order是-2147483647,優(yōu)先級最高造成,保證創(chuàng)建釋放池發(fā)生在其他所有回調(diào)之前显熏。
第二個Observer監(jiān)視了兩個事件:BeforeWaiting(準(zhǔn)備進(jìn)入休眠) 時調(diào)用_objc_autoreleasePoolPop()和_objc_autoreleasePoolPush()釋放舊的池并創(chuàng)建新池;Exit(即將退出Loop) 時調(diào)用_objc_autoreleasePoolPop()來釋放自動釋放池晒屎。這個Observer的order是2147483647喘蟆,優(yōu)先級最低,保證其釋放池子發(fā)生在其他所有回調(diào)之后鼓鲁。
在主線程執(zhí)行的代碼蕴轨,通常是寫在諸如事件回調(diào)、Timer回調(diào)內(nèi)的骇吭。這些回調(diào)會被RunLoop創(chuàng)建好的AutoreleasePool環(huán)繞著橙弱,所以不會出現(xiàn)內(nèi)存泄漏,開發(fā)者也不必顯示創(chuàng)建Pool了燥狰。
作者:Liberalism
鏈接:http://www.reibang.com/p/0d7dfb5093a8
來源:簡書
著作權(quán)歸作者所有棘脐。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處碾局。
10荆残、Block從棧中復(fù)制到堆
調(diào)用Block的copy實例方法時
Block作為函數(shù)返回值返回時
在帶有usingBlock的Cocoa方法或者GCD的API中傳遞Block時候
將block賦給帶有__strong修飾符的id類型或者Block類型時
作者:小涼介
鏈接:http://www.reibang.com/p/221d0778dcaa
來源:簡書
著作權(quán)歸作者所有奴艾。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)净当,非商業(yè)轉(zhuǎn)載請注明出處。
11蕴潦、如標(biāo)題首先需要注冊? ? [self.wkWebView.configuration.userContentController addScriptMessageHandler:self?name:@"方法名"];
didReceiveScriptMessage方法進(jìn)行監(jiān)聽
H5只需要一行代碼:window.webkit.messageHandlers.方法名.postMessage(null);//ps: 小括號里的null或者說是參數(shù)一定要寫像啼,否則iOS這點不會有回調(diào)。
12潭苞、1忽冻、+load方法是在加載類和分類時系統(tǒng)調(diào)用,一般不手動調(diào)用此疹,如果想要在類或分類加載時做一些事情僧诚,可以重寫類或者分類的+load方法方法遮婶。
2、每個類湖笨、分類的+load旗扑,在程序運行過程中只調(diào)用一次。
調(diào)用順序
1慈省、類要優(yōu)先于分類調(diào)用+load方法臀防;
2、子類調(diào)用+load方法時边败,要先要調(diào)用父類的+load方法袱衷;(父類優(yōu)先與子類,與繼承不同)笑窜;
3致燥、不同的類按照編譯先后順序調(diào)用+load方法(先編譯,先調(diào)用)排截;
4篡悟、分類的按照編譯先后順序調(diào)用+load方法(先編譯,先調(diào)用)匾寝。
call_class_loads()搬葬,call_category_loads() ;看到這兩個函數(shù)想到了什么呢艳悔?
對急凰,就是這兩個函數(shù)決定了類優(yōu)先與分類調(diào)用+load方法;
說明:+load方法是系統(tǒng)根據(jù)方法地址直接調(diào)用猜年,并不是objc_msgSend函數(shù)調(diào)用(isa抡锈,superClass);這就決定了如果子類沒有實現(xiàn)+load方法乔外,那么當(dāng)它被加載時runtime是不會調(diào)用父類的+load方法的床三,除非父類也實現(xiàn)了+load方法;
作者:呂建雄
鏈接:http://www.reibang.com/p/7a4162f59991
http://www.reibang.com/p/e6979a17da91
來源:簡書
著作權(quán)歸作者所有杨幼。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)撇簿,非商業(yè)轉(zhuǎn)載請注明出處。
13差购、iOS @autoreleasepool是什么四瘫?什么時候用?什么時候釋放?
一是Autorelease對象是在當(dāng)前的runloop迭代結(jié)束時釋放的欲逃,而它能夠釋放的原因是系統(tǒng)在每個runloop迭代中都加入了自動釋放池Push和Pop找蜜。
二是手動調(diào)用AutoreleasePool的釋放方法(drain方法)來銷毀AutoreleasePool
對于每一個Runloop, 系統(tǒng)會隱式創(chuàng)建一個Autorelease pool稳析,這樣所有的release pool會構(gòu)成一個象CallStack一樣的一個棧式結(jié)構(gòu)洗做,在每一個Runloop結(jié)束時弓叛,當(dāng)前棧頂?shù)腁utorelease pool會被銷毀,這樣這個pool里的每個Object會被release诚纸。
那什么是一個Runloop呢邪码? 一個UI事件,Timer call咬清, delegate call闭专, 都會是一個新的Runloop。
作者:GabrielPanda
鏈接:http://www.reibang.com/p/405b8dfc3829
來源:簡書
著作權(quán)歸作者所有旧烧。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)影钉,非商業(yè)轉(zhuǎn)載請注明出處。
14掘剪、http://www.reibang.com/p/d0aab0eb8ce4 ? ?iOS實時卡頓檢測-RunLoop(附實例) ?https://github.com/chenshuangsmart/CatonMonitor/tree/master/PerformanceMonitor
15平委、tableView的內(nèi)存/性能優(yōu)化和iOS性能優(yōu)化?
? ? ? ?答:tableView內(nèi)存優(yōu)化核心思想是:
? ? ? ?1夺谁、cell的復(fù)用機(jī)制廉赔,在使用cell時,只會創(chuàng)建一屏幕多一個的cell匾鸥,例如:如果一屏幕能裝下10個cell蜡塌,系統(tǒng)只需要創(chuàng)建11個cell,當(dāng)顯示第11個cell時勿负,第一個cell正在失去焦點馏艾,當(dāng)滑動到第12個cell時,第一個cell已經(jīng)完全失去焦點奴愉,放在緩存池等待復(fù)用琅摩。此時第12個cell就會使用cellIdentifier標(biāo)識去緩存池中尋找相對應(yīng)的cell,如果存在锭硼,就不用創(chuàng)建新的cell房资,直接從緩存池中取出來重新賦值。這樣做的目的是為了防止cell創(chuàng)建過多浪費內(nèi)存檀头。
? ? ? ?2轰异、cell滑動時數(shù)據(jù)( 圖片)按需加載,在cell數(shù)據(jù)過于龐大時鳖擒,快速滑動很容易造成頁面卡楨溉浙,對此問題,我首先想到的是數(shù)據(jù)的異步加載蒋荚,但異步加載在滑動時,操作依然會被執(zhí)行馆蠕,開啟線程過多時期升,對整個app的性能也會造成很大的影響惊奇。
? ? ? ?此時可以利用父類UIScrollView的兩個代理來解決這個問題。
方法一:- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate(此方法在停止拖拽時執(zhí)行)
方法二:- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView(此方法在減速停止時執(zhí)行)
? ? ? ?可利用此方法在tableView停止滑動時播赁,進(jìn)行圖片加載颂郎。加載前,調(diào)用 indexPathsForVisibleRows或者visibleCells遍歷出可見部分的indexPath數(shù)組或者cell數(shù)組容为,然后按需加載乓序。
也可以在-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法中通過截取tableView的當(dāng)前狀態(tài)來進(jìn)行圖片異步加載操作。
作者:馬威明
鏈接:http://www.reibang.com/p/4158c73690db
來源:簡書
著作權(quán)歸作者所有坎背。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)替劈,非商業(yè)轉(zhuǎn)載請注明出處。