CCache原理
https傳輸過(guò)程相關(guān)和https是否需要二次加密
ARC模式下需要注意的內(nèi)存管理
TCP/IP的三次握手
http&https工作原理
NSArray&NSMutbleArray
iOS多線程:GCD:在我們實(shí)際開(kāi)發(fā)的過(guò)程中,經(jīng)常會(huì)遇到多任務(wù)處理的情況稚矿,我們期望任務(wù)的處理順序按開(kāi)發(fā)者的意愿來(lái)進(jìn)行千绪,而不是刻板的按照某一種方法或原則称杨,由此绰上,調(diào)度任務(wù)時(shí)間順序的需求應(yīng)運(yùn)而生癣诱,我們管這個(gè)需求的解決方案叫多線程城瞎。
iOS界面渲染機(jī)制
離屏渲染+UI優(yōu)化:
- 1 各種圓角陰影渲染避免用
drawrect(CPU)
拳魁、cornerRadius
等 用CAShapeLayer(GPU)
和UIBezierPath(GPU)
來(lái)替代。 - 2 利用
runloop
來(lái)實(shí)現(xiàn)在scrollview
滑動(dòng)的時(shí)候不加載圖片狐血,從而優(yōu)化滑動(dòng)幀數(shù)。 - 3 使用異步進(jìn)行
layer
渲染(Facebook
開(kāi)源的異步繪制框架AsyncDisplayKit
) - 4 設(shè)置
layer
的opaque
值為YES
(GPU
不用考慮多色圖層層疊混色的問(wèn)題)易核,減少?gòu)?fù)雜圖層合成盡量使用不包含透明(alpha)通道的圖片資源(opaque
=YES
:GPU
將不會(huì)做任何的計(jì)算合成匈织,不需要考慮它下方的任何東西(因?yàn)槎急凰趽踝×?,而是簡(jiǎn)單從這個(gè)層拷貝牡直。這節(jié)省了GPU
相當(dāng)大的工作量缀匕。由此看來(lái),opaque
屬性的真實(shí)用處是給繪圖系統(tǒng)提供一個(gè)性能優(yōu)化開(kāi)關(guān)碰逸!,) - 5 盡量設(shè)置
layer
的大小值為整形值 - 6 直接讓美工把圖片切成圓角進(jìn)行顯示乡小,這是效率最高的一種方案
- 7 很多情況下用戶(hù)上傳圖片進(jìn)行顯示,可以讓服務(wù)端處理圓角
- 8 使用代碼手動(dòng)生成圓角
Image
設(shè)置到要顯示的View
上饵史,利用UIBezierPath
(CoreGraphics
框架)畫(huà)出來(lái)圓角圖片 - 9 適當(dāng)?shù)臅r(shí)候使用
shouldRasterize
開(kāi)啟光柵化满钟、當(dāng)一個(gè)圖像混合了多個(gè)圖層,每次移動(dòng)時(shí)胳喷,每一幀都要重新合成這些圖層湃番,十分消耗性能。當(dāng)我們開(kāi)啟光柵化后吭露,會(huì)在首次產(chǎn)生一個(gè)位圖緩存吠撮,當(dāng)再次使用時(shí)候就會(huì)復(fù)用這個(gè)緩存。
iOS isa指針以及消息傳遞過(guò)程&class的結(jié)構(gòu)
instruments
敏捷開(kāi)發(fā)
組件化開(kāi)發(fā):所謂的組件化讲竿,通俗理解就是將一個(gè)工程分成各個(gè)模塊泥兰,各個(gè)模塊之間相互解耦,可以獨(dú)立開(kāi)發(fā)并編譯成一個(gè)獨(dú)立的 APP 進(jìn)行調(diào)試题禀,然后又可以將各個(gè)模塊組合起來(lái)整體構(gòu)成一個(gè)完整的 APP鞋诗。它的好處是當(dāng)工程比較大的時(shí)候,便于各個(gè)開(kāi)發(fā)者之間分工協(xié)作投剥、同步開(kāi)發(fā)师脂;被分割出來(lái)的模塊又可以在項(xiàng)目之間共享,從而達(dá)到復(fù)用的目的。組件化有諸多好處吃警,尤其適用于比較大型的項(xiàng)目糕篇。
- RunLoop和線程的一一對(duì)應(yīng)的,對(duì)應(yīng)的方式是以key-value的方式保存在一個(gè)全局字典中
- Runloop的創(chuàng)建過(guò)程:
[NSRunLoop currentRunLoop]
-->CFRunLoopGetCurrent
-->_CFRunLoopGet0
(在這個(gè)方法里面先是去全局字典里面去找線程(key)對(duì)應(yīng)的runloop
對(duì)象酌心,若果有就取出返回拌消,如果沒(méi)有就創(chuàng)建一個(gè)runloop
對(duì)象并以線程為key
存到全局字典里面)。 - 主線程的RunLoop會(huì)在初始化全局字典時(shí)創(chuàng)建
- 子線程的RunLoop會(huì)在第一次獲取的時(shí)候創(chuàng)建安券,如果不獲取的話就一直不會(huì)被創(chuàng)建
- RunLoop會(huì)在線程銷(xiāo)毀時(shí)銷(xiāo)毀
- RunLoop 啟動(dòng)前內(nèi)部必須要有至少一個(gè) Timer/Observer/Source墩崩,所以在 [runLoop run] 之前先創(chuàng)建了一個(gè)新的 NSMachPort 添加進(jìn)去了。通常情況下侯勉,調(diào)用者需要持有這個(gè) NSMachPort (mach_port) 并在外部線程通過(guò)這個(gè) port 發(fā)送消息到 RunLoop 內(nèi)鹦筹;但此處添加 port 只是為了讓 RunLoop 不至于退出,并沒(méi)有用于實(shí)際的發(fā)送消息址貌。
- CoreFoundation源碼(包括runloop)
動(dòng)態(tài)語(yǔ)言铐拐、靜態(tài)語(yǔ)言和編譯型語(yǔ)言、解釋型語(yǔ)言
block原理:block
本質(zhì)是一個(gè) 結(jié)構(gòu)體(C++)(runtime里面练对,對(duì)象和類(lèi)都是用結(jié)構(gòu)體表示):
- (void)test
{
int a;
^{a;};
}
等于:
struct __Person__test_block_impl_0 {//block本質(zhì)結(jié)構(gòu)體
struct __block_impl impl;//block主要變量
struct __Person__test_block_desc_0* Desc;//這個(gè)存儲(chǔ)著block的大小
int a;
// block 構(gòu)造函數(shù)block定義的時(shí)候調(diào)用 a(_a)是構(gòu)造函數(shù)的參數(shù)列表初始化形式遍蟋,相當(dāng)于a = _a。從_I_Person_test看螟凭,傳入的就是a 這里進(jìn)行變量捕獲
__Person__test_block_impl_0(void *fp, struct __Person__test_block_desc_0 *desc, int _a, int flags=0) : a(_a) {
impl.isa = &_NSConcreteStackBlock;
impl.Flags = flags;
impl.FuncPtr = fp;
Desc = desc;
}
};
struct __block_impl {//block主要成員屬性
void *isa;//指向所屬類(lèi)的指針虚青,也就是block的類(lèi)型
int Flags;//標(biāo)志變量,在實(shí)現(xiàn)block的內(nèi)部操作時(shí)會(huì)用到
int Reserved;//保留變量
void *FuncPtr;//block調(diào)用的時(shí)候執(zhí)行的函數(shù)指針 實(shí)際就是 __Person__test_block_func_0
};
static void __Person__test_block_func_0(struct __Person__test_block_impl_0 *__cself) {//block調(diào)用的時(shí)候執(zhí)行的方法
int a = __cself->a; // bound by copy 獲取捕獲到的變量
a;}
static struct __Person__test_block_desc_0 {//這個(gè)存儲(chǔ)著block的大小
size_t reserved;
size_t Block_size;
} __Person__test_block_desc_0_DATA = { 0, sizeof(struct __Person__test_block_impl_0)};
static void _I_Person_test(Person * self, SEL _cmd) { //test方法
int a;
(void (*)())&__Person__test_block_impl_0((void *)__Person__test_block_func_0, &__Person__test_block_desc_0_DATA, a);
}
可以看出螺男,它包含了isa指針(包含isa指針的皆為對(duì)象)棒厘,也就是說(shuō)block也是一個(gè)對(duì)象(runtime里面,對(duì)象和類(lèi)都是用結(jié)構(gòu)體表示)烟号。
變量捕獲:局部自動(dòng)變量捕獲的變量的值绊谭、局部靜態(tài)變量捕獲的是地址(因?yàn)殪o態(tài)變量在運(yùn)行期間不會(huì)被銷(xiāo)毀)、全局變量不捕獲(因?yàn)槿肿兞吭谀睦锒伎梢栽L問(wèn) 汪拥,所以不用捕獲)
block
類(lèi)型: 全局block
达传、棧區(qū)block
、堆區(qū)block
- @property 同時(shí)實(shí)現(xiàn)set 和get方法會(huì)有什么問(wèn)題:
主要是因?yàn)楫?dāng)你復(fù)寫(xiě)了get和set方法之后@property默認(rèn)生成的@synthesize就不會(huì)起作用了迫筑,這也就意味著你的類(lèi)不會(huì)自動(dòng)生成出來(lái)實(shí)例變量了宪赶,你就必須要自己聲明實(shí)例變量。 - mutablearray copy是否會(huì)復(fù)制內(nèi)存地
- iOS開(kāi)發(fā)-修飾代理delegate用weak還是assign
- iOS關(guān)鍵字大全
- iOS 自動(dòng)釋放池(AutoreleasePool)
- flutter生命周期
-
MVC脯燃、MVP搂妻、MVVM淺析:
從MVC、MVP到MVVM辕棚,實(shí)際上是模型和視圖的分離過(guò)程欲主。MVC中模型和視圖沒(méi)有完全分離邓厕,造成Activity代碼臃腫,MVP中通過(guò)Presenter來(lái)進(jìn)行中轉(zhuǎn)扁瓢,模型和視圖徹底分離详恼,但由于V和P互相引用,代碼不夠優(yōu)雅引几。ViewModel通過(guò)Data Binding實(shí)現(xiàn)了視圖和數(shù)據(jù)的綁定昧互,解決了這種MVP的缺陷。但是數(shù)據(jù)綁定使得 Bug 很難被調(diào)試伟桅。你看到界面異常了敞掘,有可能是你 View 的代碼有 Bug,也可能是 Model 的代碼有問(wèn)題楣铁。 - 使用atomic一定是線程安全的嗎玖雁?
- TCP\UDP工作原理及區(qū)別
- pod install和podupdate的使用區(qū)別
- 數(shù)組和鏈表的區(qū)別
- iOS靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)
- socket通訊原理
- KVC原理
- xcode編譯過(guò)程
- HTTPCode
- iOS簽名原理
- App啟動(dòng)優(yōu)化之二進(jìn)制重排
- weak的實(shí)現(xiàn)原理