一句話筆記,某段時(shí)間內(nèi)遇到或看到的某個(gè)可記錄的點(diǎn)昼窗。 2016-8-19
- removerFromSuperView 的使用
- NSArray 中 lastObject firstObject
- .dSYM 文件的初步了解
- 使用 insertItemsAtIndexPaths 遇到的一個(gè)問題
1给涕、 removerFromSuperView 的使用
在某些視圖界面,我們經(jīng)常會(huì)用到 removerFromSuperView該方法,但是 removerFromSuperView 之后绍妨,那個(gè)view 的內(nèi)存塊真的立馬消失啦嗎盅抚?
首先漠魏,我們清楚的是addSubview
& removeFromSuperview
兩者是對(duì)應(yīng)的:
- (void)addSubview:(UIView *)view;
- (void)removeFromSuperview;
通過 MAC 中,測試發(fā)現(xiàn) 使用 addSubview 時(shí)view 的retainCount 是加1的妄均,而使用 removeFromSuperview 時(shí) view 也是加1的柱锹,這很奇怪,但你多次使用 removeFromSuperview 又會(huì)因?yàn)閮?nèi)存提早是釋放而被崩掉丰包,原因是:
在MRC時(shí)期經(jīng)常發(fā)現(xiàn)retainCount不準(zhǔn)確禁熏,這主要是因?yàn)閕OS系統(tǒng)API的引用、或自動(dòng)釋放池導(dǎo)致的;
所以retainCount并不能當(dāng)做可靠的參考邑彪。
而我們現(xiàn)在基本都是在ARC的環(huán)境下瞧毙,而提到的問題,removerFromSuperView 之后寄症,那個(gè)view 的內(nèi)存塊真的立馬別干掉嗎宙彪? 答案肯定是不會(huì)的,準(zhǔn)確的消失的時(shí)間不確定有巧,應(yīng)該是 當(dāng)前runloop 結(jié)束后消失的释漆,反正在 dealloc 之前肯定會(huì)被干掉。
言簡意賅篮迎,在ARC 中男图,對(duì)于內(nèi)存這塊的考慮,我們使用 removeFromSuperview 時(shí) 是沒有必要太多擔(dān)憂的柑潦,另外就算我們重復(fù)使用該方法享言,系統(tǒng)也只會(huì)執(zhí)行一次,不必?fù)?dān)心多次使用的問題渗鬼。
同時(shí)注意官方文檔中提到的:
Never call this method from inside your view’s drawRect: method.
永遠(yuǎn)不要在你的view的drawRect方法中調(diào)用removeFromSuperview览露;
更詳細(xì)可閱讀:隨便說說removeFromSuperview方法
2、 NSArray 中 lastObject firstObject
為什么會(huì)對(duì)比一下這兩個(gè)方法呢譬胎?因?yàn)閕OS 7.0 之前是沒有暴露 firstObject 的差牛,所以不得不重看一下,當(dāng)時(shí)好多人都是直接寫一個(gè)分類獲取該方法的堰乔,同時(shí)注意的是注意當(dāng)時(shí)Mac OSX的SDK并沒有偏化,后期才出來的
@property (nullable, nonatomic, readonly) ObjectType firstObject
NS_AVAILABLE(10_6, 4_0);
雖說上面寫的是 Mac OS 10.6 和 iOS 4_0 就有了,但是之前是沒有暴露的镐侯。所以此處是提醒自己一定要注意 版本的差異性侦讨。
#import "NSArray+firstObject.h"
@implementation NSArray (firstObject)
- (id) firstObject {
if (self.count > 0) {
return [self objectAtIndex:0];
}else{
return nil;
}
}
@end
PS: 備注看看 YY 寫 的 NSArray 丟失的 firstObject 方法.
3、.dSYM 文件的初步了解
在Xcode編譯項(xiàng)目之后,會(huì)在app旁看見一個(gè)同名的.dSYM文件韵卤,它是一個(gè)編譯的中轉(zhuǎn)文件骗污,簡單說就是 debug 的 symbols 包含在這個(gè)文件中。
- 作用:當(dāng)release的版本 crash的時(shí)候沈条,會(huì)有一個(gè)日志文件需忿,包含出錯(cuò)的內(nèi)存地址,,使用symbolicatecrash工具能夠把日志和dSYM文件轉(zhuǎn)換成可以閱讀的log信息蜡歹,也就是將內(nèi)存地址屋厘,轉(zhuǎn)換成程序里的函數(shù)或變量和所屬于的 文件名。
PS:備注學(xué)習(xí):dSYM 文件分析工具
所以注意發(fā)布程序的時(shí)候保留.dSYM 文件可與用來還原崩潰
4月而、 使用
insertItemsAtIndexPaths
遇到的一個(gè)問題
在用UICollectionView的時(shí)候汗洒,加載更多數(shù)據(jù)的時(shí)候后,可以直接用[self.collectionView reloadData]
, 但是會(huì)出現(xiàn)一閃的情況景鼠,而調(diào)用 insertItemsAtIndexPaths
則可以很好的解決這個(gè)問題仲翎,但是我用的的時(shí)候遇到這個(gè)BUG: _endItemAnimationsWithInvalidationContext:tentativelyForReordering:
經(jīng)過查找網(wǎng)上問題,檢查并結(jié)合自己的代碼發(fā)現(xiàn)了兩個(gè)以下會(huì)發(fā)生上述bug的原因:
- 數(shù)據(jù)源的數(shù)量與操作cell后的cell的數(shù)量不一致
- 在使用下面方法的時(shí)候同時(shí)調(diào)用了
[self.collectionView reloadData];
- 使用 performBatchUpdates 配合铛漓,這個(gè)一般不會(huì)崩潰溯香,但可能有意想不到的問題。
- (void)insertItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths;
- (void)deleteItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths;
- (void)reloadItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths;
同時(shí)也注意用到這個(gè)方法:
- (void)performBatchUpdates:(void (^ __nullable)(void))updates completion:(void (^ __nullable)(BOOL finished))completion; // allows multiple insert/delete/reload/move calls to be animated simultaneously. Nestable.
[self.collectionView performBatchUpdates:^{
[self.collectionView insertItemsAtIndexPaths:indexPaths];
} completion:NULL];
使用該系列方法一定要注意這兩個(gè)坑浓恶,稍不注意就可能遇到該Bug玫坛。