項目進度到尾期要上線了,對于自定義頭像需要做拍照截取保存功能,但是怎么樣拍照后的原圖都無法保存,按照常理同樣的代碼極難出現保存失敗的情況,項目又是ex程序員交接給我的,直覺想到會是第三方的分類修改了某個implmentation.還好有萬能谷歌,搜索一下果然如此
麻煩就在NSDictionary+NilSafe.h這個分類上了,仔細閱讀了一下它的實現,確實是很實用,網絡層數據交互的等場景對nil指針的操作變為 NSNull實例對象,不會因為NSNull出現crash,找到問題直接刪除這個分類拍照保存的功能自然就實現了,但是刪除了又會有很多莫名的其他crash坑等著我填,沒辦法只能修改這個分類了.代碼如下.
在頭文件增加兩個類方法:
@interface NSDictionary (NilSafe)
+ (void)dcitionaryCancelNilSafe;//取消NilSafe
+ (void)reuseDictionaryNilSafe;//復用NilSafe
@end
@interface NSMutableDictionary (NilSafe)
+ (void)mutableDcitionaryCancelNilSafe;
+ (void)reuseMutableDictionaryNilSafe;
@end
具體實現如下:
+ (void)dcitionaryCancelNilSafe{
[self gl_swizzleMethod:@selector(gl_initWithObjects:forKeys:count:) withMethod:@selector(initWithObjects:forKeys:count:)];
[self gl_swizzleClassMethod:@selector(gl_dictionaryWithObjects:forKeys:count:) withMethod:@selector(dictionaryWithObjects:forKeys:count:)];
}
+ (void)reuseDictionaryNilSafe{
[self gl_swizzleMethod:@selector(initWithObjects:forKeys:count:) withMethod:@selector(gl_initWithObjects:forKeys:count:)];
[self gl_swizzleClassMethod:@selector(dictionaryWithObjects:forKeys:count:) withMethod:@selector(gl_dictionaryWithObjects:forKeys:count:)];
}
+ (void)mutableDcitionaryCancelNilSafe{
Class class = NSClassFromString(@"__NSDictionaryM");
[class gl_swizzleMethod:@selector(gl_setObject:forKey:) withMethod:@selector(setObject:forKey:)];
[class gl_swizzleMethod:@selector(gl_setObject:forKeyedSubscript:) withMethod:@selector(setObject:forKeyedSubscript:)];
}
+ (void)reuseMutableDictionaryNilSafe{
Class class = NSClassFromString(@"__NSDictionaryM");
[class gl_swizzleMethod:@selector(setObject:forKey:) withMethod:@selector(gl_setObject:forKey:)];
[class gl_swizzleMethod:@selector(setObject:forKeyedSubscript:) withMethod:@selector(gl_setObject:forKeyedSubscript:)];
}
具體的場景使用,例如在你所需要的控制器開始和結束是分類調用取消和復用方法:
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[NSDictionary dcitionaryCancelNilSafe];
[NSMutableDictionary mutableDcitionaryCancelNilSafe];
}
- (void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
[NSDictionary reuseDictionaryNilSafe];
[NSMutableDictionary reuseMutableDictionaryNilSafe];
}
這樣就O98K了