学计算机的那个

不是我觉到、悟到,你给不了我,给了也拿不住;只有我觉到、悟到,才有可能做到,能做到的才是我的.

0%

面试题 1

假设我有一个类

1
2
3
4
5
6
7
8
9
@interface OrderPint : NSObject

- (id)init;
- (void)first;//打印"first"
- (void)second;//打印"second"
- (void)third;//打印"third"
- (void)run:(NSString *)order;

@end

三个不同的线程ABC将会共用一个 OrderPint 实例
线程A 会调用 first 方法
线程B 会调用 second 方法
线程C 会调用 third 方法

请完善OrderPint,让 first second third 按照指定的顺序被打印

例如
输入 @”123” 打印

1
2
3
first
second
third

输入 @”321” 打印

1
2
3
third
second
first
阅读全文 »

并发编程的幕后

随着CPU、内存和I/O设备的不断升级,它们之间一直存在着一个矛盾,就是速度不一致问题。CPU的速度高于内存,内存的速度又高于I/O设备。

我们写的代码中大多数内容都会经过内存处理,有些内容会去读写I/O设备,根据木桶理论,整体的性能取决于最慢的操作,就是I/O设备,所以单单提升CPU的性能是不够的。

为了最大化体现出CPU的性能,计算机底层主要做了三部分优化:

  1. CPU增加了缓存,比内存速度更快,平衡内存的速度

  2. 操作系统增加了进程和线程,可以对CPU分时复用

  3. 编译程序会进行指令的重排,使缓存更好的发挥性能

我们平时的工作中其实一直都享受着这些优化后的成果,但同时他们也会导致一些很难找到原因的BUG。

阅读全文 »

Switch

switch 语句会尝试把某个值与若干个模式(pattern)进行匹配。根据第一个匹配成功的模式,switch 语句会执行对应的代码。当有可能的情况较多时,通常用 switch 语句替换 if 语句。

1
2
3
4
5
6
7
8
9
switch <#some value to consider#> {
case <#value 1#>:
<#respond to value 1#>
case <#value 2#>,
<#value 3#>:
<#respond to value 2 or 3#>
default:
<#otherwise, do something else#>
}
阅读全文 »

结合 Core Data 和 SwiftUI

SwiftUI 和 Core Data 几乎是在十年前后被分别引入 —— SwiftUI 是伴随 iOS 13, 而 Core Data 是伴随 iPhoneOS 3 发布;

Core Data 是一个“对象图谱和持久化框架”,这是对于定义对象和对象属性,然后从永久存储中读写它们的高级叫法。表面上看,使用它意味着使用CodableUserDefaults这些东西,但它远不止这些:Core Data 能够排序和过滤我们的数据,对于更大的数据也成立 —— 基本上对于数据量没有限制。更棒的是,Core Data 还实现了各种高级的功能,你会依赖它们:包括数据可视化,数据懒加载,撤销和重做,等等。

阅读全文 »

让GeometryReader来解决吧

父级视图想要什么?

当你给自定义视图编码时,你通常不需要担心它周围的环境和它的尺寸。举个例子,假设你需要创建一个绘制矩形的视图,你只要绘制一个 Rectangle 就好了。它会以父级视图指定的尺寸和位置被绘制。

阅读全文 »