聊聊架构、内存拷贝、Swift 新特性: iOS 面试场景复习题 ,20190720
以下进入捏的场景,小明去面试
第一题: 怎样展现小明仅有的架构能力
问:你怎么做 iOS 组件化的?
小明想,代码写起来爽,不就行了
程序员要提供一点数据结构
答:CTMediate
(同一份代码,各人理解,存在差异。
以下是个人观点,该官方博客,没看的,建议看下。
那篇的许多观点,下文不作引用)
为什么要组件化?随着项目代码的庞大,机器性能不够,人力来凑。如果机器性能很好,项目一秒钟 run 起来。组件化的必要性,可能少了一些。
当然还有做动态插件化,与大项目好分组、分功能开发等优势。
没组件化的时候,模块 A 调用模块 B, 需要在 A 中,import B.
A 才能知道 B 暴露的方法,去使用 B 提供的能力。
现在要实现组件化,就不好相互 import , 循环引用。
这个时候,就是靠约定。组件化开发,感觉画风一变,UI 层变网络层,和同事约定接口的事情多一些
组件化,要解耦,基本功能就是组件之间的传值,与回调,要清爽
小明画了一个 CTMediate 的架构图
Mediate 负责具体的实现部分,就像一个黑盒,把约定的功能给执行了,把结果给返回出去。
执行方法分三个方面,target 调用者、selector 方法名、params 参数,这些在模块内,一般都是作为对象使用。要解耦,就不知道,别的模块是什么类型了,就要通过 native 原生类型,去调用。
Mediate + 对应业务的 Category, 才是完整的中间者。
一般中间者模式,都是引用子模块,作为 hub 解耦。
这边有一个优化,通过分别建立对应的 category, 改统一注册,为分散注册。相对清爽
这个 Mediate + 对应模块的 Categoty, 才是中间者。
第二题: 你知道 dynamic 关键字?
面试小哥:你会 swift 是吧?
小明:会的
面试小哥:来个简单点的啊,你知道 dynamic 关键字
小明:Objective-C 有一个 dynamic 关键字,手动设置 get/ set 方法
面试小哥:这个 dynamic ,是 @dynamicCallable,是用来动态调方法的。为了 Swift 的,调用机器学习功能...
举个例子: Swift 代码中调用 JavaScript, 来一个 JS 的绑定
@dynamicCallable @dynamicMemberLookup struct JSValue { // JavaScript doesn't have keyword arguments. @discardableResult func dynamicallyCall(withArguments: [JSValue]) -> JSValue { ... } // This is a `@dynamicMemberLookup` requirement. subscript(dynamicMember member: JSValue) -> JSValue {...} // ... other stuff ... }
面试小哥接着问:你知道 Swift 5 的新特性吗?
小明:?
面试小哥: Swift 5 发布, Swift 的 ABI 稳定了。ABI 的稳定性,增加了不同 Swift 版本的 app 应用和库的二进制包的兼容性。Swift 的运行时与标准库,就内置在手机里面的 iOS 操作系统里面了。
Swift 的 ABI 稳定了,你打的包会小一些。
这个不知道,你不是 Swifter, 我们不要你
Swift 5 的新特性,还有刚才说的 @dynamicCallable
面试小哥接着问:你知道 Swift 4.2 的新特性吗?
小明: ?
面试小哥: Swift 4.2 的新特性有 @dynamicMemberLookup, 这个用于动态查属性,为了 Swift 的,调用机器学习功能...
Swift 5 的新特性 @dynamicCallable,就是这个的加强
(小明挺服的,一个知识点,可以问三次)
举个例子: Swift 代码中调用 Python
@dynamicMemberLookup struct PyVal { ... subscript(dynamicMember member: String) -> PyVal { get { let result = PyObject_GetAttrString(borrowedPyObject, member)! return PyVal(owned: result) } set { PyObject_SetAttrString(borrowedPyObject, member, newValue.borrowedPyObject) } } }
Swift 4.2 的新特性还有, 做了一个类型的加强,去除了隐式的、没有拆包的可选类型。
let favoriteNumbers: [Int!] = [10, nil, 7, nil]
变成了 let favoriteNumbers: [Int?] = [10, nil, 7, nil]
Ray Wenderlich 里面的博客,还有十几项,其他优化
(小明回头查了下,有些自己项目中涉及到,处理了,没总结。)
面试小哥: 你知道 SE 吗?
小明: 你说的是 WWDC 的一集编号?
面试小哥: WWDC 那个是 Session.
SE, 是 Swift 革命,Swift Evolution, 是一个 github repo. 我说的 @dynamicCallable, @dynamicMemberLookup 都在那上面。 WWDC 上面好像没有
面试小哥接着说: 你不知道 @dynamicCallable, @dynamicMemberLookup, 应该也不会 Swift 调用 python, 也就是不会在项目中使用机器学习。你走吧
小明决定回家补觉去了
面试小哥最后一问:你平时看谁的博客?
小明: 老唐的
面试小哥:你竟然不看老卓的
第三题: 到了深浅拷贝的时间了
问:copy 和 mutableCopy 是深拷贝,还是浅拷贝?
NSArray * arr = @[@1,@2,@3]; NSLog(@"arr__%p", arr); NSArray * arrCocy = [arr copy]; NSLog(@"arrCocy__%p", arrCocy); NSArray * arrMutableCopy = [arr mutableCopy]; NSLog(@"arrMutableCopy__%p", arrMutableCopy); NSLog(@"__--111--"); NSMutableArray * arrMutable = [NSMutableArray arrayWithArray: arr]; NSLog(@"arrMutable__%p", arrMutable); NSArray * mutableCocy = [arrMutable copy]; NSLog(@"mutableCocy__%p", mutableCocy); NSArray * arrMuMutableCopy = [arrMutable mutableCopy]; NSLog(@"arrMuMutableCopy__%p", arrMuMutableCopy);
$: arr__0x600002160030 $: arrCocy__0x600002160030 $: arrMutableCopy__0x600002160f00 $: __--111-- $: arrMutable__0x600002161440 $: mutableCocy__0x600002161470 $: arrMuMutableCopy__0x6000021612f0
对 NSArray 的 copy 是浅拷贝,其他三个都是深拷贝。执行 copy 和 mutableCopy 的操作,返回的指针,打印出来的首地址是这样的。
苹果文档里面写的是, init 、copy 和 mutableCopy 都是实例化方法。都是分配一块内存,创建一个对象。譬如 copy 会调用 - (id)copyWithZone:(NSZone *)zone;
.
小明想:NSArray 怎么搞的?
拿着一块内存区域,去拷贝,返回新的实例,还是浅拷贝。
因为 NSArray 的对象是不可修改的,他的指针只要两种操作,赋新的值,赋值为 nil (赋新的值是 nil) 。
他的指针,赋新的值了,关这个对象什么事呀。这个对象的引用计数会减 1,为 0 则销毁。这个对象以及指向他的指针,其他一切照常。
他的指针,为 nil,关这个对象什么事。该对象的引用计数会减 1,为 0 销毁。该对象以及指向他的指针,其他一切照常。
所以,这里设计为浅拷贝,好一些。
第四题: 说一下你的优缺点
说一下你的优点,和不足,一般是人事问,面试填表、CTO 和以后的 leader 有时候也会
小明想,普通人嘛,什么有缺点的。
小明觉得,他缺点是反应有点慢,优点是反应有点慢,细心,严谨,深思熟虑
小明又想,他是会点算法的。
答:来一次遍历吧
支撑他走到这一步的,都是优点,小明从中级工程师到高级工程师,具有经验丰富、认真、负责等特质
没支撑他走到更高的,算是不足,譬如架构师的大局观、底层研究能力、框架设计能力,CTO 的技术选型与决策能力、优秀的团队管理能力,是小明暂时不具备的。答这些,感觉没什么事,又不是招 CTO
小明简答了架构,接着聊聊
小明想,组件化,苹果的设计,大佬嘛,木有问题吧
Xcode 是苹果的,LLVM ,苹果有话语权
出一个方案,整一个胶水层模版,搞组件化,或者把 CTMediate 内置,分分钟的事情吧
苹果要是出个组件化,几个大组件化、超级 app 出来以后,App Store 有凉的可能性
面试需谨慎,本文可参考下
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Spring Cloud 之 Zuul.
Spring Cloud 之 Zuul.Spring Cloud 之 Zuul. 阅读目录 一、概述二、准备阶段三、请求转发四、请求过滤五、Hystrix 和 Ribbon 支持回到顶部一、概述 API 网关是一个更为智能的应用服务器,它的定义类似于面向对象设计模式中的 Facade 模式,它的存在就像是整个微服务架构系统的门面一样,所有的外部客户端访问都需要经过它来进行调度和过滤。它除了要实现请求路由、负载均衡、校验过滤等功能之外,还需要更多能力,比如与服务治理框架的结合、请求转发时的熔断机制、服务的聚合等一系列高级功能。 在 Spring Cloud 中了提供了基于 Netflix Zuul 实现的 API 网关组件 Spring Cloud Zuul。 回到顶部二、准备阶段SpringBoot 版本号:2.1.6.RELEASESpringCloud 版本号:Greenwich.RELEASE pom.xml <dependencies> <dependency> <groupId>org.springframework.cloud</g...
- 下一篇
阿里巴巴王坚:用数据来改变世界
“传统信息化建设都是从无到有,加了杆子和机器,但是新一代数字建设就是从有到无,缴费的机器没有了,你回家缴,杆子没有了,你回家缴。” 7月21日,阿里巴巴技术委员会主席王坚在2019年中国电子政务论坛上发表演讲。他表示,现在智慧城市建设有很多的误区。但与很多顶尖公司用数据解释这个世界不同,浙江政府是从数据多跑一次开始第一个用数据在改变世界。 他表示,很多智慧城市花了那么多钱,但是并没有达到想要的结果。根源在于有几个认知上的错误。“社会发展到今天,城市不完成一次数字化,怎么支撑产业化发展,甚至数字政府”。“ 传统信息化建设都是从无到有,不断加杆子和机器,该付几次钱该付几次钱”。 王坚提出一个让老百姓困扰已久的问题:医院为了让老百姓付钱方便,就加了付款机器,后来又让手机可以支付而现在杭州做了一个件事,病人从就诊到走就付一次钱,甚至回家后再付。
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装