1. 在使用block中,局部變量為什么要用__block修飾才能改變它的值沦寂?,到底發(fā)生了什么腻暮?
可以做一個(gè)測(cè)試毯侦,上代碼 示例1
結(jié)果:
用__block修飾后 示例2
對(duì)比示例1和示例2發(fā)現(xiàn)不加__block叫惊,block內(nèi)部會(huì)重新生成了一變量做修。示例1中生成的變量依然在棧區(qū)抡草,地址減4蔗坯,不加__block之所以不能修改局部變量是因?yàn)榫幾g器加了限制,默認(rèn)不允許修改腿短。而以上說明绘梦,并沒有脫離變量a的作用域,詳見執(zhí)行順序钝诚。因?yàn)閇UIView animateWithDuration:中的block會(huì)立即執(zhí)行榄棵,這也是為何不用weakSelf不會(huì)造成循環(huán)引用的原因。
2. OC的幾種排序疹鳄?時(shí)間復(fù)雜度?二分法查找的實(shí)現(xiàn)垫蛆?
3. assign可以修飾代理嗎杠茬?
修飾代理用weak,誰都知道宁赤。那assign可不可以呢栓票?答案是可以的
對(duì)于assing:也有weak的功效。但是assign是指針賦值佛猛,不對(duì)引用計(jì)數(shù)操作坠狡,使用之后如果沒有置為nil,可能就會(huì)產(chǎn)生野指針逃沿;而weak一旦不進(jìn)行使用后幻锁,永遠(yuǎn)不會(huì)使用了哄尔,就不會(huì)產(chǎn)生野指針柠并。
4. NSTimer在主線程什么時(shí)候會(huì)發(fā)生計(jì)時(shí)不準(zhǔn)?怎么解決臼予? 在子線程使用NSTimer需要注意什么?
如果NSTimer的當(dāng)前線程堵塞葵擎,會(huì)造成計(jì)時(shí)器計(jì)時(shí)不準(zhǔn)半哟。(主線程也不例外)
注意:在子線程使用NSTimer時(shí)候一定要手動(dòng)啟動(dòng)Runloop,否則計(jì)時(shí)器不會(huì)執(zhí)行
要讓timer生效盯串,必須保證該線程的runloop已啟動(dòng)戒良,而且其運(yùn)行的runloopmode也要匹配。
5. tableView的性能優(yōu)化
1.cell復(fù)用
2.cell高度的計(jì)算
3.cell上圖片的渲染糯崎,利用預(yù)渲染加速顯示iOS圖像
4.cell背景不使用透明,不要使用陰影
對(duì)于shadow沃呢,如果圖層是個(gè)簡(jiǎn)單的幾何圖形或者圓角圖形,我們可以通過設(shè)置shadowPath來優(yōu)化性能某抓,能大幅提高性能惰瓜。
5.減少cell上的視圖數(shù)量,重寫drawRect方法
6.減少多余的繪制操作
在實(shí)現(xiàn)drawRect方法的時(shí)候备禀,它的參數(shù)rect就是我們需要繪制的區(qū)域,在rect范圍之外的區(qū)域我們不需要進(jìn)行繪制痹届,否則會(huì)消耗相當(dāng)大的資源。
7.不要給cell動(dòng)態(tài)添加subView
在初始化cell的時(shí)候就將所有需要展示的添加完畢,然后根據(jù)需要來設(shè)置hide屬性顯示和隱藏柴淘。
8.異步化UI秘通,不要阻塞主線程
9.滑動(dòng)時(shí)按需加載對(duì)應(yīng)的內(nèi)容
如果目標(biāo)行與當(dāng)前行相差超過指定行數(shù),只在目標(biāo)滾動(dòng)范圍的前后指定3行加載第股。
10.減少離屏渲染
11.圓角優(yōu)化
使用貝塞爾曲線UIBezierPath和Core Graphics框架畫出一個(gè)圓角
使用CAShapeLayer和UIBezierPath設(shè)置圓角
6 函數(shù)返回一個(gè)對(duì)象時(shí)话原,會(huì)對(duì)對(duì)象autorelease么?為什么繁仁?autorelease是什么時(shí)候釋放的?
會(huì)對(duì)對(duì)象 autorelease稚矿,因?yàn)樾枰谏院筢尫艑?duì)象捻浦,從而給調(diào)用者留下足夠長(zhǎng)的時(shí)間,使其可以在需要時(shí)先保留返回值昧识。此方法可以保證對(duì)象在跨越方法調(diào)用邊界時(shí)一定存活母剥。
除非你有自己的自動(dòng)釋放池,否則這個(gè)時(shí)機(jī)就是當(dāng)前線程,當(dāng)前事件循環(huán)結(jié)束時(shí)习霹,就是 RunLoop 結(jié)束時(shí)(observer -> beforeWaiting)炫隶。
// 情況一:
@autoreleasepool {
NSObject * obj = [NSObject new];
[obj autorelease];
NSLog(@"%d",[obj retainCount]); //1
}
// 情況二:
NSObject * obj = [NSObject new];
[obj autorelease];
[obj autorelease];
NSLog(@"%d",[obj retainCount]);
NSLog(@"%d",[obj retainCount]);
// 崩潰
// 情況三:
NSObject * obj;
@autoreleasepool {
obj = [NSObject new];
[obj autorelease];
NSLog(@"%d",[obj retainCount]); // 1
}
//crash 出了大括號(hào)就已經(jīng)被銷毀了
NSLog(@"%d",[obj retainCount]);