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.工厂设计模式
简单说,就是将初始化方法延迟到子类,在子类的初始化方法中进行定制,而父类的这个虚的初始化方法,就是工厂方法。例如uiview
的init
和initwithframe
。
父类拥有几个不同的子类,执行父类的初始化方法传参,决定具体使用哪个子类进行初始化,初始化的具体参数不同,父类不用区分,直接调用相应方法。
- (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,或者调试,防止崩溃使用
网友评论