iOS面试题(二)

1、给⼀个数组,要求⽤swift写⼀个函数,交换数组中的两个元素.

var nums = [1,2,3,4,5,6,7]
主要考察泛型和元组

func swap(_ nums: inout [T], _ a : Int, _ b : Int){
    let count = nums.count
    if a==b || a<0 || a>count-1 || b<0 || b>count-1 {
        return
    }
    (nums[a],nums[b]) = (nums[b],nums[a])
}

swap(&nums,1, 3)
print(nums)
//[1,4,3,2,5,6,7]

2、这段代码有什么问题?

class Node {
    var value = 0
    var prev : Node?
    var next : Node?
    
    init (_ value : Int) {
        self.value = value
    }
}

主要考察循环引用的问题,如下面代码:

 let a = Node(0)
 let b = Node(1)
 a.prev = b
 b.next = a

解决方法,加上weak

 weak var prev : Node?
 weak var next : Node?

3、使用swift实现一个函数,输入是任一整数,输出要返回输入的整数 + 2。

主要考察柯里化

/// 什么是柯里化?
// 柯里化指的是从一个多参数函数变成一连串单参数函数的变换

func add(input: Int) -> (Int) -> Int {
    return { value in
        return input + value
    }
}

let addTwo = add(input: 2)
let output = addTwo(2)     //4
let output2 = addTwo(8)  //10

let addSix = add(input: 6)  //可以随便改成+n
let output3 = addSix(2)     //8
let output4 = addSix(8)  //14

4、简化已下的代码

func division(dividend: Double?, by divisor: Double?) -> Double? {
    if dividend == nil {
        return nil
    }
    
    if divisor == nil {
        return nil
    }
    
    if divisor == 0 {
        return nil
    }
    
    return dividend! / divisor!
}

主要考察if let,guard let,可选链式调用

/// if let 和可选链式调用
func division1(dividend: Double?, by divisor: Double?) -> Double? {
    if let dividend = dividend, let divisor = divisor, divisor != 0 {
        return dividend / divisor
    }
    return nil
}
/// guard let 和可选链式调用
func division2(dividend: Double?, by divisor: Double?) -> Double? {
    guard let dividend = dividend, let divisor = divisor, divisor != 0 else {
        return nil
    }
    return dividend / divisor
}

5、这段代码打印什么

var car = "Benz"
let closure = { [car] in
    print("I drive \(car)")
}
car = "BMW"
closure()

输出:I drive Benz
主要考察全局变量和局部变量

let closure = { [car] in
    print("I drive \(car)")
}

将声明的参数car,赋值给了局部变量[car] ,与外部变量无关,如果想要打印BMW,需要将[car] in去掉

6、iOS静态库与动态库的区别

  • 静态库:链接时会被完整的复制到可执行文件中,被多次
    使用就有多份拷贝。
  • 动态库:链接时不复制,程序运行时由系统动态加载到内
    存,系统只加载一次,多个程序共用,节省内存。

7、内存优化

检测内存问题的一般 方法:

    1. 静态检测方法
    1. 动态检测方法
      instruments
    1. dealloc
    1. 第三⽅自动检测库

8、runtime基本用法

    1. ⽤runtime改变变量值
    1. 使用runtime交换方法
    1. 使用runtime添加方法
    1. 使用runtime给分类扩展属性

9、assign 与 weak, 它们都是弱应用声明类型, 最大的区别在哪呢?

  • weak 声明的变量对象释放后自动清空, 赋值为nil
  • assign声明的变量对象释放后不会自动赋值为nil, 会造成野指针错误!

答案都是收集而来,如果有什么错误,欢迎指正!

你可能感兴趣的:(iOS面试题(二))