iOS面试问题

作者: HannaJuan | 来源:发表于2019-10-28 11:06 被阅读0次

    翻译来源:https://medium.com/@abhimuralidharan/ios-interview-questions-736e27a96a74

    1、Objective-c中有扩展吗?

    有。

    2、objective C中类别和扩展有什么区别?

    可以为任何类声明一个类别,即使您没有原始的实现源代码。

    类别和扩展具有一些相似之处,但是只能在类编译时间添加扩展。

    类别允许你在主接口文件以外添加方法。然而扩展必须在主接口文件中实现。意味这可以推断出不能为内建类或者你不知道源代码的类声明扩展,这时候你应该使用类别。当你需要访问类代码时可以使用扩展。

    0.jpg

    3、swift中控制流关键字

    Swift中switch语句不会进入每一个情况的底部而进入下一个情况。这样整个Switch语句执行完成很快第一个匹配情况就会完成。

    swift中fallthrough语句是基于需求执行案例语句直到找到符合情况的语句。

    “case 4” is also executed even though it doesn’t match the criteria

    fallthough关键字不会为switch情况检查引起执行结束的案例条件。fallthrough关键字仅仅调用代码向下执行语句(或默认情况)闭包,和C语言标准的switch语句行为一样。

    4、swift中如何在协议中声明一个可选方法?

    有两种方式。

    纯粹的swift方式可以使用protocol extension 提供默认实现。

    oc兼容方式使用@objc和optional关键字

    1.jpg

    注意:oc的缺点:兼容方式就像上面例子MyProtocolObjc变成一个类的协议.结构体无法遵守这个协议。

    2.jpg

    错误:SomeStruct类型无法遵守类协议"MyProtocolObjc"

    5、写一个函数实现不使用反转函数反转一个字符串

    面试的时候如果让你在纸上写代码,那真的是很扯。

    第一个想到的写到纸上的方法如下:

    3.jpg

    你可以使用高阶函数“Reduce”来实现。

    4.jpg

    6、解释UIButton的类层级。

    NSObject → UIResponder → UIView → UIControl → UIButton.

    UITextField, UITextView, UISlider, UIDatePicker, UIPageControl, UISegmentedControl, UIStepper, UISwitch 等都继承自UIControl。

    每个父类的职责和角色是什么?

    UIResponder: 响应和处理事件的抽象类。响应者会实现 touchesBegan(_:with:)touchesMoved(_:with:), 第一响应者处理键盘和输入相关事件等。

    UIView: 屏幕中管理内容的一个矩形区域

    UIControl: 控制器的基础类。

    *处理控制器状态例如:启用,不可用,聚焦,高亮等。

    *处理事件例如:触摸,点击,值更改,输入框的编辑等等。

    *添加事件,移除事件,处理事件等。

    7、UIViewController的父类 

    UIResponder → UIViewController

    8、UIWindow的父类

    UIView → UIWindow

    9、一个iOS应用有多少个窗口?

    一个应用一次仅有一个活跃的窗口

    苹果文档:每一个应用程序最少一个窗口展示应用用户界面在设备主屏幕。如果额外展示连接设备,应用也可以创建第二个窗口展示内容在屏幕。

    10、swift中Self 与self的区别

    Self仅在代理或在类中一个方法的返回结果中可用。

    当你编写代理和扩展代理时,这里Self和self是不同的。当使用Self遵守代理的类型引用,比如String 或Int。当使用小写self是类型的值引用,比如:“hello”或556.

    注意: BinaryInteger 是一个协议。

    extension BinaryInteger { 

        func squared() ->Self{ returnself*self}

    }

    11、Swift类中静态方法/变量和类方法/变量的区别?

    在类中静态和类都是关联方法或属性的,而不是关联类的实例。不同之处在于子类能重载类方法;不可以重载静态方法。因此在类里,静态方法关键字写法如下:

    final class someFunction()

    因此,静态是内部最终。

    静态方法是静态派遣意味着编译器知道,作为静态方法在运行时会被执行时是不能被重载的,除非类方法作为一个动态分配是可以被子类重载。

    12、解释final关键字是如何保护在子类中被重载的?

    通过标记为final可以免于方法、属性、脚注重载。通过final的修改方法、属性、脚注之前的介绍关键字(像这样final var, final func, final class func, and final subscript).

    你可以通过写final修改class之前的关键字,标记一个内部类作为最终。任何企图去修改继承自final类的子类编译器都会报错。

    如前面提到的,你也可以使用static关键字它具有final class的功能。

    引用:StackOverflow

    5.jpg

    13、分别解释OC和swift中的原子性

    oc中默认值为原子性

    Swift中默认值为非原子性

    定义一个属性为原子性将会保证返回一个有效值。声明属性为原子性编译器会生成额外代码保护当前对属性的操作。此额外的代码锁定了信号质量,然后获取或设置属性,然后解锁信号。如果线程A调用获取的同时线程B和C调用设置不同的值,线程A可能会得到其中优先调用设置的值或者任意其中在线程B和C中传递到设置方法的值之一。同样的,这个对象可能以来自B或C中的值结束,无从知晓。

    由于在设置/获取值之前和之后的锁定和解锁,原子属性遭受的性能影响较小。

    非原子操作属性对与返回的值没有保障的。它可能是正确的值,部分被修改的值或甚至是一些垃圾值。

    Swift中没有atomic/non-atomic关键字。当多个线程试图访问同一个值时,我们应该使用锁或信号等确保属性的原子性。

    原子性属性(原子性和非原子性)是没有影响的在相应的swift属性声明中,但是从Swift访问导入的属性时,Objective-C实现的原子性保证仍然有效。

    14、什么是单例模式?如果在swift创建一个单例?

    在应用的整个生命周期中只能存在一个单例。单例的存在为我们提供了单一全局状态。例如:NSNotificationCenter, UIApplication, 和 NSUserDefaults。

    final class Singleton {

    static let sharedInstance = Singleton()

    private init() {} // init should be private

    }

    任何使用let关键字声明的变量都是常量,因此只读和线程安全。

    静态关键字确保它是内部是只会初始化一次的懒加载模式。静态默认是内部最终。

    dispatch_once: 执行一个闭包对象一次并且在应用生命周期只有一次。

    确保初始化方法是私有的,这样就没人可以直接访问init()方法和创建一个新的单例类。

    15、枚举可以有存储属性吗?

    枚举可以有方法、脚注和计算的属性。但是不能存储属性。

    16、你可以在没有付费的开发者账号的情况下安装iOS应用到一个真机吗?

    是的,你可以,但是在苹果开发平台不注册,你的应用将只能使用7天在你的设备上。之后,你必须使用Xcode重新部署它到设备上。如果注册苹果开发者,不会有这种麻烦。

    17、可以把let作为weak吗?

    不,‘weak’必须是一个可变的变量,因为它可能会改变在运行时。当我们声明一些变成weak,它可能会有一个值或不会有。一旦没有引用指向它,就会被设置为nil.

    classSomeClass { }

    classSomeOtherClass {

    weak let someClassObj: SomeClass? = nil

    // error: 'weak' must be a mutable variable, because it may change at runtime}

    18、可以把let作为unowned?

    可以,unowned引用总会有一个值。非可选。

    注意:UNOWEND引用可以是一个let 或var。

    相关文章

      网友评论

        本文标题:iOS面试问题

        本文链接:https://www.haomeiwen.com/subject/wjajvctx.html