Friday-QA icon indicating copy to clipboard operation
Friday-QA copied to clipboard

iTeaTime(技术清谈)【004期】【代号:林肯】

Open ChenYilong opened this issue 5 years ago • 4 comments

iTeaTime(技术清谈)【004期】【代号:林肯】



出题:微博@iOS程序犭袁 本期代号:林肯



从未被讨论过的问题,不公布答案。顺延到下一期。只要讨论过,答案不正确也会提供答案。下面将讨论过的问题公布答案:

今天会从没有修改马甲(马甲格式为【昵称+地区/公司/职位】)的同学中随机抽取几位幸运儿,送出飞机票若干张。待会儿我出题,回答任意一道即可,别人回答过的,不能再回答,交卷时间为出题日第二天20点。因为是自己出的题,大部分网上没有答案。可以讨论,没点名同学,抢答正确后,请自觉补充同类型问题一道供点名同学回答。题目能够精准筛选非技术同学即可,不需要很难。


1【问题】【编程基础】如何用一行代码,互换两个变量的值,且不产生第三个变量。

【方法一】【啥玩意儿啊-iOS-北京,提供答案】利用Swift元组特性: 可以在定义的同时就取出元祖中的值 // 相当于同时定义了三个变量 let (name, age, score) = (“a”, 30, 99.9)

根据这一特性,我们可以这样互换值: (a, b) = (b, a)

【方法二】【消摇提供答案】 (a = a ^ b) && (b = a ^ b) && (a = a ^ b) 或者这样 a = a ^ b; b = a ^ b; a = a ^ b;

(a = a + b) && (b = a - b) && (a = a - b) (a = a x b) && (b = a / b) && (a = a / b)

【方法三】【消摇提供答案】 a = ( a + b ) - b * ( b = a );


2【问题】【iOS】如何给view同时加上圆角和阴影?至少给出两种实现方法,使用到的API越高级越好。 【提示】两种方法,答案提示:UIBezierPath,和iOS11 layer有个新的方法 【答案】iOS11的layer是maskedCorners,CACornerMask。

参考链接:

标题&链接 手机端阅读
标题:ios 圆角 cornerRadius 对性能的影响究竟多大? 你测试过吗?
链接:https://www.jianshu.com/p/13820dbf5d20

3【问题】【计算机常识】在开发中,我们在重连等场景中,为避免造成过度的资源消耗,我们常常把重试的时间间隔做递增处理,有时是指数级增长方式,比如第1次与第二次时间间隔为2秒,第二次与第三次时间间隔为4秒,然后是8秒,我们有时也按照1,3,5这样的规律递增。这种编程技巧的名称是什么?

【答案】指数退避算法。


4 【问题】【算法】《易传·系辞上传》:“易有太极,是生两仪,两仪生四象,四象生八卦。”,这句话结合下面的几张图,与计算机数据结构中的哪个概念更为相近,描述该概念,越详细越好。问题如下: 六十四卦所在结构中节点数是多少? 六十四卦中的任意一卦,在上述数据结构体系中对应的概念叫什么? 六十四卦中的任意一卦的高度与深度分别是多少? “完全” 与 “满” 用哪一个,形容下面的图片更为贴切?

14153248314177 jpg

v2-30f016d2570d0f3717312be92922fb9c_r

【答案】总体是二叉树,高度是 0 深度是7,节点数是 2ˆ7-1, 满二叉树。参考下图:

image


5【问题】【hybrid-app】js与native交互中,js如何调用native方法,native如何调js方法,借助的中间foundation叫什么。给出核心步骤对应函数,重点给出前端和native需要约定联调的部分。【难度🌟🌟🌟】【出题人 微博@iOS程序犭袁】 【提示】推荐 《一本走心的 JS-Native 交互电子书》 。 【答案】【群成员闪舞提供】 native 能直接调用 js [webView stringByEvaluatingJavaScriptFromString:javascriptCommand];

js 不能直接调用 native 的方法,但是可以间接的通过一些方法来实现。可以利用 UIWebView 的 webView: shouldStartLoadWithRequest: navigationType: 代理方法来做。 WKWebView 中可以通过 webView: decidePolicyForNavigationAction: decisionHandler:

要想触发native 的 webView: shouldStartLoadWithRequest: navigationType方法,可以通过下面两种形式: 1.创建 iframe 标签 2.设置 window 的 location

核心步骤:

  1. native 加载 html,其中的 script 标签里(也就是 js 代码), js 创建 iframe 标签,并设置它的 src 属性为 wvjbscheme://BRIDGE_LOADED,并且把回掉放到一个数组里 2.在 webView: shouldStartLoadWithRequest: navigationType 方法中拦截 wvjbscheme://BRIDGE_LOADED,并加载本地(桥中)的 js 3.本地(桥) js 创建隐藏的 iframe 标签并且修改 src 为 wvjbscheme://WVJB_QUEUE_MESSAGE,这样就又能在 webView: shouldStartLoadWithRequest: navigationType 拦截了。

6【问题】【iOS】猜想dequeueReusableCellWithIdentifier的实现是怎样的,给出示例代码。注意边界条件:相邻cell的identifier相等时。你的实现中该函数的时间复杂度是多少。为什么?【难度🌟🌟🌟🌟】【出题人 微博@iOS程序犭袁】 cell复用机制的实现猜想,见 GitHub-Chameleon

- (UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier
{
   for (UITableViewCell *cell in _reusableCells) {
       if ([cell.reuseIdentifier isEqualToString:identifier]) {
           UITableViewCell *strongCell = cell;
           
           // the above strongCell reference seems totally unnecessary, but without it ARC apparently
           // ends up releasing the cell when it's removed on this line even though we're referencing it
           // later in this method by way of the cell variable. I do not like this.
           [_reusableCells removeObject:cell];

           [strongCell prepareForReuse];
           return strongCell;
       }
   }
   
   return nil;
}

时间复杂度为: O(n)

注意:

NSArray / NSMutableArray

containsObject:containsObject:indexOfObject*removeObject: 会遍历里面元素查看是否与之匹对,所以复杂度等于或大于 O(n)。

这里 _reusableCells 使用的是NSMutableSet,而 NSSet / NSMutableSet / NSCountedSet

这些集合类型是无序没有重复元素。这样就可以通过 hash table 进行快速的操作。比如 addObject:, removeObject:, containsObject: 都是按照 O(1) 来的。需要注意的是将数组转成 Set 时会将重复元素合成一个,同时失去排序。

加之 for 循环,可以得到复杂度计算结果。

参考:《深入剖析 iOS 性能优化》


7【问题】如图:用autolayout做下横竖屏适配:【难度🌟🌟🌟】【出题人 微博@iOS程序犭袁】

里面:蓝色是父视图,子视图是Label和图片,图片可拉伸。Label和图片总是相对居中显示。 对图片顶端,label底端,拉伸,水平总是居中。

Screenshot 2019-04-26 at 8 56 03 PM

【答案】把两个子视图,包一层View,不一定是StackVIew,也可以是普通View,内部搞好约束,top、left、bottom、right。再对中间层view做水平、垂直居中操作即可。

类似前端方案:【十代-小公司-泉州iOS提供】 使用 FlexLib 框架:

Pasted Graphic 1 Pasted Graphic 2


Posted by 微博@iOS程序犭袁
原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0


One more thing...

【非礼勿视】以下为彩蛋部分,建议28岁以上男性观看


image

ChenYilong avatar Jul 16 '19 13:07 ChenYilong

【方法三】【消摇提供答案】 a = ( a + b ) - b * ( b = a );

这里有点看不懂,不应该是这样写吗 a = b + 0 * ( b = a);

CoderXJLee avatar Oct 24 '19 07:10 CoderXJLee

【方法三】【消摇提供答案】 a = ( a + b ) - b * ( b = a );

这里有点看不懂,不应该是这样写吗 a = b + 0 * ( b = a);

我觉着你的✅

KeymonWong avatar Mar 18 '20 05:03 KeymonWong

第六题。

通过identifier进行dequeue,时间复杂度不应该是O(1)吗。用一个NSDictionary存储,key是identifier,由于通过identifier直接获取到cell,可能会是多个,所以value对应的是数组。

所有待重用cell,并不一定直接放在reusableCells中,获取reusableCells的时候可以获取NSDictionary的所有value,并拼装成一个数组。这样的设计,在进行cell查找这种高频操作时,效率会更高。

DeveloperErenLiu avatar May 19 '21 14:05 DeveloperErenLiu

【方法三】【消摇提供答案】 a = ( a + b ) - b * ( b = a );

这个答案确实不对,应该是这样 a = b + 0 * ( b = a);

liuniuliuniu avatar Jun 23 '21 05:06 liuniuliuniu