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

面试小知识总结

作者: 夜雨聲煩_ | 来源:发表于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