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

本文通过面试场景,探讨了iOS开发中的组件化实现方法及Swift语言特性的运用,包括CTMediate架构设计、dynamic关键字的应用以及深浅拷贝的区别。

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

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

问:你怎么做 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 有凉的可能性

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值