CCache原理
https傳輸過程相關和https是否需要二次加密
ARC模式下需要注意的內存管理
TCP/IP的三次握手
http&https工作原理
NSArray&NSMutbleArray
iOS多線程:GCD:在我們實際開發的過程中,經常會遇到多任務處理的情況,我們期望任務的處理順序按開發者的意愿來進行,而不是刻板的按照某一種方法或原則,由此,調度任務時間順序的需求應運而生,我們管這個需求的解決方案叫多線程。
iOS界面渲染機制
離屏渲染+UI優化:
- 1 各種圓角陰影渲染避免用
drawrect(CPU)
、cornerRadius
等 用CAShapeLayer(GPU)
和UIBezierPath(GPU)
來替代。 - 2 利用
runloop
來實現在scrollview
滑動的時候不加載圖片,從而優化滑動幀數。 - 3 使用異步進行
layer
渲染(Facebook
開源的異步繪制框架AsyncDisplayKit
) - 4 設置
layer
的opaque
值為YES
(GPU
不用考慮多色圖層層疊混色的問題),減少復雜圖層合成盡量使用不包含透明(alpha)通道的圖片資源(opaque
=YES
:GPU
將不會做任何的計算合成,不需要考慮它下方的任何東西(因為都被它遮擋住了),而是簡單從這個層拷貝。這節省了GPU
相當大的工作量。由此看來,opaque
屬性的真實用處是給繪圖系統提供一個性能優化開關!,) - 5 盡量設置
layer
的大小值為整形值 - 6 直接讓美工把圖片切成圓角進行顯示,這是效率最高的一種方案
- 7 很多情況下用戶上傳圖片進行顯示,可以讓服務端處理圓角
- 8 使用代碼手動生成圓角
Image
設置到要顯示的View
上,利用UIBezierPath
(CoreGraphics
框架)畫出來圓角圖片 - 9 適當的時候使用
shouldRasterize
開啟光柵化、當一個圖像混合了多個圖層,每次移動時,每一幀都要重新合成這些圖層,十分消耗性能。當我們開啟光柵化后,會在首次產生一個位圖緩存,當再次使用時候就會復用這個緩存。
iOS isa指針以及消息傳遞過程&class的結構
instruments
敏捷開發
組件化開發:所謂的組件化,通俗理解就是將一個工程分成各個模塊,各個模塊之間相互解耦,可以獨立開發并編譯成一個獨立的 APP 進行調試,然后又可以將各個模塊組合起來整體構成一個完整的 APP。它的好處是當工程比較大的時候,便于各個開發者之間分工協作、同步開發;被分割出來的模塊又可以在項目之間共享,從而達到復用的目的。組件化有諸多好處,尤其適用于比較大型的項目。
- RunLoop和線程的一一對應的,對應的方式是以key-value的方式保存在一個全局字典中
- Runloop的創建過程:
[NSRunLoop currentRunLoop]
-->CFRunLoopGetCurrent
-->_CFRunLoopGet0
(在這個方法里面先是去全局字典里面去找線程(key)對應的runloop
對象,若果有就取出返回,如果沒有就創建一個runloop
對象并以線程為key
存到全局字典里面)。 - 主線程的RunLoop會在初始化全局字典時創建
- 子線程的RunLoop會在第一次獲取的時候創建,如果不獲取的話就一直不會被創建
- RunLoop會在線程銷毀時銷毀
- RunLoop 啟動前內部必須要有至少一個 Timer/Observer/Source,所以在 [runLoop run] 之前先創建了一個新的 NSMachPort 添加進去了。通常情況下,調用者需要持有這個 NSMachPort (mach_port) 并在外部線程通過這個 port 發送消息到 RunLoop 內;但此處添加 port 只是為了讓 RunLoop 不至于退出,并沒有用于實際的發送消息。
- CoreFoundation源碼(包括runloop)
動態語言、靜態語言和編譯型語言、解釋型語言
block原理:block
本質是一個 結構體(C++)(runtime里面,對象和類都是用結構體表示):
- (void)test
{
int a;
^{a;};
}
等于:
struct __Person__test_block_impl_0 {//block本質結構體
struct __block_impl impl;//block主要變量
struct __Person__test_block_desc_0* Desc;//這個存儲著block的大小
int a;
// block 構造函數block定義的時候調用 a(_a)是構造函數的參數列表初始化形式,相當于a = _a。從_I_Person_test看,傳入的就是a 這里進行變量捕獲
__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;//指向所屬類的指針,也就是block的類型
int Flags;//標志變量,在實現block的內部操作時會用到
int Reserved;//保留變量
void *FuncPtr;//block調用的時候執行的函數指針 實際就是 __Person__test_block_func_0
};
static void __Person__test_block_func_0(struct __Person__test_block_impl_0 *__cself) {//block調用的時候執行的方法
int a = __cself->a; // bound by copy 獲取捕獲到的變量
a;}
static struct __Person__test_block_desc_0 {//這個存儲著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指針的皆為對象),也就是說block也是一個對象(runtime里面,對象和類都是用結構體表示)。
變量捕獲:局部自動變量捕獲的變量的值、局部靜態變量捕獲的是地址(因為靜態變量在運行期間不會被銷毀)、全局變量不捕獲(因為全局變量在哪里都可以訪問 ,所以不用捕獲)
block
類型: 全局block
、棧區block
、堆區block
block的三種類型
- @property 同時實現set 和get方法會有什么問題:
主要是因為當你復寫了get和set方法之后@property默認生成的@synthesize就不會起作用了,這也就意味著你的類不會自動生成出來實例變量了,你就必須要自己聲明實例變量。 - mutablearray copy是否會復制內存地
- iOS開發-修飾代理delegate用weak還是assign
- iOS關鍵字大全
- iOS 自動釋放池(AutoreleasePool)
- flutter生命周期
-
MVC、MVP、MVVM淺析:
從MVC、MVP到MVVM,實際上是模型和視圖的分離過程。MVC中模型和視圖沒有完全分離,造成Activity代碼臃腫,MVP中通過Presenter來進行中轉,模型和視圖徹底分離,但由于V和P互相引用,代碼不夠優雅。ViewModel通過Data Binding實現了視圖和數據的綁定,解決了這種MVP的缺陷。但是數據綁定使得 Bug 很難被調試。你看到界面異常了,有可能是你 View 的代碼有 Bug,也可能是 Model 的代碼有問題。 - 使用atomic一定是線程安全的嗎?
- TCP\UDP工作原理及區別
- pod install和podupdate的使用區別
- 數組和鏈表的區別
- iOS靜態庫和動態庫
- socket通訊原理
- KVC原理
- xcode編譯過程
- HTTPCode
- iOS簽名原理
- App啟動優化之二進制重排
- weak的實現原理