聊聊架构、内存拷贝、Swift 新特性: iOS 面试场景复习题 ,20190720

简介: 聊聊架构、内存拷贝、Swift 新特性: iOS 面试场景复习题 ,20190720

以下进入捏的场景,小明去面试

第一题: 怎样展现小明仅有的架构能力

问:你怎么做 iOS 组件化的?

小明想,代码写起来爽,不就行了

程序员要提供一点数据结构

答:CTMediate

(同一份代码,各人理解,存在差异。
以下是个人观点,该官方博客,没看的,建议看下。
那篇的许多观点,下文不作引用)

为什么要组件化?随着项目代码的庞大,机器性能不够,人力来凑。如果机器性能很好,项目一秒钟 run 起来。组件化的必要性,可能少了一些。
当然还有做动态插件化,与大项目好分组、分功能开发等优势。

没组件化的时候,模块 A 调用模块 B, 需要在 A 中,import B.
A 才能知道 B 暴露的方法,去使用 B 提供的能力。

现在要实现组件化,就不好相互 import , 循环引用。

这个时候,就是靠约定。组件化开发,感觉画风一变,UI 层变网络层,和同事约定接口的事情多一些

组件化,要解耦,基本功能就是组件之间的传值,与回调,要清爽

小明画了一个 CTMediate 的架构图

122

Mediate 负责具体的实现部分,就像一个黑盒,把约定的功能给执行了,把结果给返回出去。

执行方法分三个方面,target 调用者、selector 方法名、params 参数,这些在模块内,一般都是作为对象使用。要解耦,就不知道,别的模块是什么类型了,就要通过 native 原生类型,去调用。

Mediate + 对应业务的 Category, 才是完整的中间者。

一般中间者模式,都是引用子模块,作为 hub 解耦。

屏幕快照 2019-07-20 下午3.35.57.png

这边有一个优化,通过分别建立对应的 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 有凉的可能性

面试需谨慎,本文可参考下

目录
相关文章
|
2月前
|
安全 Android开发 iOS开发
深入探索Android与iOS的差异:从系统架构到用户体验
在当今的智能手机市场中,Android和iOS无疑是最受欢迎的两大操作系统。本文旨在探讨这两个平台之间的主要差异,包括它们的系统架构、开发环境、安全性、以及用户体验等方面。通过对比分析,我们可以更好地理解为何不同的用户群体可能会偏好其中一个平台,以及这些偏好背后的技术原因。
|
2月前
|
Android开发 Swift iOS开发
深入探索iOS与Android操作系统的架构差异及其对应用开发的影响
在当今数字化时代,移动设备已经成为我们日常生活和工作不可或缺的一部分。其中,iOS和Android作为全球最流行的两大移动操作系统,各自拥有独特的系统架构和设计理念。本文将深入探讨iOS与Android的系统架构差异,并分析这些差异如何影响应用开发者的开发策略和用户体验设计。通过对两者的比较,我们可以更好地理解它们各自的优势和局限性,从而为开发者提供有价值的见解,帮助他们在这两个平台上开发出更高效、更符合用户需求的应用。
|
4月前
|
IDE Android开发 iOS开发
深入解析Android与iOS的系统架构及开发环境差异
本文旨在探讨Android和iOS两大主流移动操作系统在系统架构、开发环境和用户体验方面的显著差异。通过对比分析,我们将揭示这两种系统在设计理念、技术实现以及市场策略上的不同路径,帮助开发者更好地理解其特点,从而做出更合适的开发决策。
205 2
|
5月前
|
JavaScript
【Vue面试题十四】、说说你对vue的mixin的理解,有什么应用场景?
这篇文章详细介绍了Vue中`mixin`的概念、应用场景和源码分析,解释了`mixin`如何用于代码复用、功能模块化,并通过实际代码示例展示了在Vue组件中局部混入和全局混入的使用方式。
【Vue面试题十四】、说说你对vue的mixin的理解,有什么应用场景?
|
5月前
|
并行计算 数据挖掘 大数据
[go 面试] 并行与并发的区别及应用场景解析
[go 面试] 并行与并发的区别及应用场景解析
|
2月前
|
架构师 数据库
大厂面试高频:数据库乐观锁的实现原理、以及应用场景
数据库乐观锁是必知必会的技术栈,也是大厂面试高频,十分重要,本文解析数据库乐观锁。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
大厂面试高频:数据库乐观锁的实现原理、以及应用场景
|
1月前
|
Java 关系型数据库 数据库
京东面试:聊聊Spring事务?Spring事务的10种失效场景?加入型传播和嵌套型传播有什么区别?
45岁老架构师尼恩分享了Spring事务的核心知识点,包括事务的两种管理方式(编程式和声明式)、@Transactional注解的五大属性(transactionManager、propagation、isolation、timeout、readOnly、rollbackFor)、事务的七种传播行为、事务隔离级别及其与数据库隔离级别的关系,以及Spring事务的10种失效场景。尼恩还强调了面试中如何给出高质量答案,推荐阅读《尼恩Java面试宝典PDF》以提升面试表现。更多技术资料可在公众号【技术自由圈】获取。
|
1月前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统架构差异及其对开发者的影响
本文旨在通过对比分析iOS和Android两大移动操作系统的系统架构,探讨它们在设计理念、技术实现及开发者生态方面的差异。不同于常规摘要仅概述内容要点,本摘要将简要触及核心议题,为读者提供对两大平台架构特点的宏观理解,铺垫
|
2月前
|
IDE 安全 Android开发
深入探索Android与iOS操作系统的架构差异
本文旨在对比分析Android和iOS两大主流移动操作系统在架构设计上的根本差异。通过详细解读两者的系统架构、开发环境、以及安全性等方面,揭示它们各自的特点及优势,为开发者选择合适的平台提供参考。
|
2月前
|
安全 Android开发 iOS开发
深入探讨Android与iOS的系统架构差异
本文旨在通过对比分析Android和iOS两大移动操作系统的系统架构,揭示它们在设计理念、安全性、应用生态及开发环境等方面的显著差异。我们将从底层架构出发,逐步剖析至用户界面层面,为开发者和科技爱好者提供一份详尽的技术参考。
43 1