美文网首页
面试小知识总结

面试小知识总结

作者: 夜雨聲煩_ | 来源:发表于2021-03-25 11:28 被阅读0次

    1.若你去设计一个通知中心,你会怎样设计?

    个人理解: 参考现有的通知中心
    创建通知中心单例类,并在里面有个一个保存通知的全局NSDiction
    对于注册通知的类,将其注册通知名作为key, 执行的方法和类,以及一些参数做为一个数组为值
    发送通知可以调用通知中心,通过字典key(通知名),找到对应的 类和方法进行执行调用传值.

    2.OC与 JS交互方式有哪些?

    • 通过拦截URL
    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
        NSString *url = request.URL.absoluteString;
        if ([url rangeOfString:@"需要跳转源生界面的URL判断"].location != NSNotFound) {
            //跳转原生界面
            return NO;
        }
        return YES;
    }
    
    • JS调用OC代码(messageHander)
    - (void)addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name;
    
    • 开源第三方WebViewJavascriptBridge
    1. 设置 webViewBridge
    _bridge = [WKWebViewJavascriptBridge bridgeForWebView:self.webView];
        [_bridge setWebViewDelegate:self];
    2. 注册handler方法,需要和 前段协商好 方法名字,是供 JS调用Native 使用的。
        [_bridge registerHandler:@"scanClick" handler:^(id data, WVJBResponseCallback responseCallback) {
            // OC调用
            NSString *scanResult = @"http://www.baidu.com";
            // js 回调传参
            responseCallback(scanResult);
        }];
    3. OC掉用JS
      [_bridge callHandler:@"testJSFunction" data:@"一个字符串" responseCallback:^(id responseData) {
            NSLog(@"调用完JS后的回调:%@",responseData);
        }];
    
    • 苹果推出的JavaScriptCore
    // 直接运行 使用 
    NSString *jsStr = @"执行的JS代码";
    [webView stringByEvaluatingJavaScriptFromString:jsStr];
    
    // 使用JavaScriptCore框架
    #import <JavaScriptCore/JavaScriptCore.h>  
    - (void)webViewDidFinishLoad:(UIWebView *)webView {
        //获取webview中的JS内容
        JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
        NSString *runJS = @"执行的JS代码";
        //准备执行的JS代码
        [context evaluateScript:runJS];
    }
    

    3.工厂设计模式

    简单说,就是将初始化方法延迟到子类,在子类的初始化方法中进行定制,而父类的这个虚的初始化方法,就是工厂方法。例如uiviewinitinitwithframe
    父类拥有几个不同的子类,执行父类的初始化方法传参,决定具体使用哪个子类进行初始化,初始化的具体参数不同,父类不用区分,直接调用相应方法。

    - (void)viewDidLoad {
        [super viewDidLoad];
        TramsPortationFactory * tool = [TramsPortationFactory buyTool:car];
        tool.delegate=self;
        [tool run];
        NSLog(@"花了:%d钱",[tool shouldPayMoney]);
        TramsPortationFactory * tool2 = [TramsPortationFactory buyTool:airport];
        tool2.delegate=self;
        [tool2 run];
        NSLog(@"花了:%d钱",[tool2 shouldPayMoney]);
     }
    

    4.iOS 9 以后通知不再需要手动移除

    原因是在 MRC 时代,通知中心持有的是注册者的 unsafe_unretained 指针,在注册者被回收时若不对通知进行手动移除,则指针指向被回收的内存区域,变为野指针。 而在 iOS 9 以后,通知中心持有的是注册者的 weak 指针,这时即使不对通知进行手动移除,指针也会在注册者被回收后自动置空。因为向空指针发送消息是不会有问题的。

    5.如何对 NSMutableArray 进行 KVO

    @property (nonatomic, strong) NSMutableArray *arr;
    
    //添加元素操作
    [[self mutableArrayValueForKey:@"arr"] addObject:item];
    //移除元素操作
    [[self mutableArrayValueForKey:@"arr"] removeObjectAtIndex:0];
    

    6.容错

    不要太信任后台的数据。不要太信任同事的代码。做容错处理,任何时候不要出现闪退。

    • 使用runtime方法的交换技术,做一些防崩溃处理。
    • 在对数据处理上,先判断,再处理。

    7.@try @catch异常机制

    try{
       //..执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容
    }catch(){
      //...除非try里面执行代码发生了异常,否则这里的代码不会执行
    }finally{
      //..不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally
    }
    可以用于查找 bug,或者调试,防止崩溃使用
    

    相关文章

      网友评论

          本文标题:面试小知识总结

          本文链接:https://www.haomeiwen.com/subject/pdochltx.html