iOS開發(fā):拍照無法保存?你要注意NilSafe的分類了

項目進度到尾期要上線了,對于自定義頭像需要做拍照截取保存功能,但是怎么樣拍照后的原圖都無法保存,按照常理同樣的代碼極難出現(xiàn)保存失敗的情況,項目又是ex程序員交接給我的,直覺想到會是第三方的分類修改了某個implmentation.還好有萬能谷歌,搜索一下果然如此
麻煩就在NSDictionary+NilSafe.h這個分類上了,仔細(xì)閱讀了一下它的實現(xiàn),確實是很實用,網(wǎng)絡(luò)層數(shù)據(jù)交互的等場景對nil指針的操作變?yōu)?NSNull實例對象,不會因為NSNull出現(xiàn)crash,找到問題直接刪除這個分類拍照保存的功能自然就實現(xiàn)了,但是刪除了又會有很多莫名的其他crash坑等著我填,沒辦法只能修改這個分類了.代碼如下.
在頭文件增加兩個類方法:

@interface NSDictionary (NilSafe)
+ (void)dcitionaryCancelNilSafe;//取消NilSafe
+ (void)reuseDictionaryNilSafe;//復(fù)用NilSafe
@end

@interface NSMutableDictionary (NilSafe)
+ (void)mutableDcitionaryCancelNilSafe;
+ (void)reuseMutableDictionaryNilSafe;
@end

具體實現(xiàn)如下:

+ (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:)];
}

具體的場景使用,例如在你所需要的控制器開始和結(jié)束是分類調(diào)用取消和復(fù)用方法:

- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [NSDictionary dcitionaryCancelNilSafe];
    [NSMutableDictionary mutableDcitionaryCancelNilSafe];
}
- (void)viewDidDisappear:(BOOL)animated{
    [super viewDidDisappear:animated];
    [NSDictionary reuseDictionaryNilSafe];
    [NSMutableDictionary reuseMutableDictionaryNilSafe];
}

這樣就O98K了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容