博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS面试题(二)
阅读量:6627 次
发布时间:2019-06-25

本文共 2331 字,大约阅读时间需要 7 分钟。

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)     //4let output2 = addTwo(8)  //10let addSix = add(input: 6)  //可以随便改成+nlet output3 = addSix(2)     //8let 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, 会造成野指针错误!

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

转载于:https://www.cnblogs.com/WinJayQ/p/9106368.html

你可能感兴趣的文章
Codeforces Gym 100203I I WIN 最大流
查看>>
windows下超越dirx的opencv视频转化库
查看>>
一起采坑redis(4)redis 管理命令--redis 批量删除key脚本(待完善)
查看>>
Python SimpleHTTPServer
查看>>
OBIEE 简介
查看>>
CRF,没完全看懂
查看>>
TEA加密/解密算法
查看>>
C++ Primer Plus 笔记第十二章
查看>>
WebControl向XSLT传参
查看>>
网络工程师课程---7、网络通信综合实验(做网络基础综合实验 用什么软件)...
查看>>
php实现 简单密码(代码颜色变化)
查看>>
splay树入门(带3个例题)
查看>>
php实现把二叉树打印成多行(谋而后动,写好算法思路,不然浪费超多时间而且还是错误代码,而且精力消耗会导致代码正确率下降以及低级错误)...
查看>>
回溯1--素数环
查看>>
20145328 《信息安全系统设计基础》期中总结
查看>>
20145328 《网络对抗技术》恶意代码分析
查看>>
VirtualBox使用
查看>>
用 Flask 来写个轻博客 (11) — M(V)C_创建视图函数
查看>>
Linux操作常识
查看>>
(5/24) 模块化:实现快速CSS文件打包
查看>>