//創建URL //該方法不安全,string錯誤時也不會報錯,需要加入判斷 NSURL *url = [NSURL URLWithString:@"www.baidu.com/哈哈哈"]; if (url == nil) { NSLog(@"url 為空"); }//打印結果:
//如何把創建url創建的代碼不做任何改變就添加為空判斷?
添加一個URL的分類 NSURL+ChangeMethods(使用該分類甚至不需要導入頭文件)
// NSURL+ChangeMethods.h#import <Foundation/Foundation.h>@interface NSURL (ChangeMethods)+ (instancetype)WSY_URLWihString:(NSString *)string;@end// NSURL+ChangeMethods.m#import "NSURL+ChangeMethods.h"#import <objc/message.h> //此處一定要導入@implementation NSURL (ChangeMethods)//加載這個分類時候調用的生命周期方法+ (void)load{ //獲取對象方法,第一個參數為對象 第二額參數為Method方法對象 //class_getInstanceMethod(<#__unsafe_unretained Class cls#>, <#SEL name#>) //獲取類方法,第一個參數為類Class 第二額參數為Method方法對象 //class_getClassMethod(<#__unsafe_unretained Class cls#>, <#SEL name#>) //交換方法的實現 method_exchangeImplementations(<#Method m1#>, <#Method m2#>) //獲取方法名稱 Method URLMethod = class_getClassMethod([NSURL class], @selector(URLWithString:)); Method WSYMethod = class_getClassMethod([NSURL class], @selector(WSY_URLWihString:)); //交換方法實現 method_exchangeImplementations(URLMethod, WSYMethod);}//此處方法已與URLWithString:交換+ (instancetype)WSY_URLWihString:(NSString *)string{ NSURL *url = [NSURL WSY_URLWihString:string]; //因為方法名已交換,此處實質是調用了URLWithString: if (url == nil) { NSLog(@"這個Url為空"); } return url;}@end再次回到控制器,重新初始化URLNSURL *url = [NSURL URLWithString:@"www.baidu.com/哈哈哈"];運行查看結果
總結:
類似于UIImage imageWithNamed:這一類的系統類的這類初始化方法都可以采用此方法加一道安全監測
開發時可以用來監測,發布時最好改回原來正常代碼
新聞熱點
疑難解答