1.Swift中的值类型和引用类型在使用中有什么不同之处?并举例说明它们在内存中的存储方式。
回答:值类型直接存储数据,传递时复制;引用类型存储对数据的引用,传递时共享。值类型适合存储简单的数据,引用类型适合共享和动态修改数据。值类型通常被分配在栈上,引用类型通常被分配在堆上。
2.请解释Swift中的可选链和空合并运算符的作用,并举例说明它们的使用场景。
回答:这两个功能都是为了避免因为nil引发的崩溃。可选链就是将多个可选调用组合起来,安全地访问可选类型的属性和方法,它使用问号(?)来在调用可能为nil的属性、方法或下标时进行条件检查,避免因为nil而导致的运行时错误,如果有一个可选类型为nil,那么整个可选链将返回nil。空合运算符(??)提供了一种更简洁的方式来处理可选值为nil的情况,返回一个默认值。
3.请解释Swift中的ARC(自动引用计数)是什么,以及它是如何工作的?它的作用和优势是什么?
回答:ARC是一种自动内存管理技术,可以帮助程序员避免手动管理内存的错误。当对象被创建时引用计数为1,当对象被使用时引用计数加1,当对象不再被使用时引用计数减1,当引用计数为0时,会自动释放该对象。ARC可以避免内存泄漏和野指针问题,提高了应用的稳定性和性能。
4.谈谈对UIResponder的理解
UIResponder类是专门用来响应用户的操作处理各种事件的,包括触摸事件(Touch Events)、运动事件(Motion Events)、远程控制事件(Remote Control Events)。我们知道UIApplication、UIView、UIViewController这几个类是直接继承自UIResponder,所以这些类都可以响应事件。当然我们自定义的继承自UIView的View以及自定义的继承自UIViewController的控制器都可以响应事件。
5.keyWindow 和 delegate的window有何区别
delegate.window 程序启动时设置的window对象。
keyWindow 这个属性保存了[windows]数组中的[UIWindow]对象,该对象最近被发送了[makeKeyAndVisible]消息
一般情况下 delegate.window 和 keyWindow 是同一个对象,但不能保证keyWindow就是delegate.window,因为keyWindow会因为makeKeyAndVisible而变化,例如,程序中添加了一个悬浮窗口,这个时候keywindow就会变化。
6.如何实现一个线程安全的 NSMutableArray?
要实现一个线程安全的 NSMutableArray,可以使用互斥锁(NSLock)或者串行队列(dispatch_queue)来实现。
7.什么情况使用weak关键字,相比assign有什么不同?
什么情况使用 weak 关键字?
在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如: delegate 代理属性
自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用 weak,自定义 IBOutlet 控件属性一般也使用 weak。
不同点:
weak 此特质表明该属性定义了一种“非拥有关系” (nonowning relationship)。为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特质同assign类似, 然而在属性所指的对象遭到摧毁时,属性值也会清空(nil out)。 而 assign 的“设置方法”只会执行针对“纯量类型” (scalar type,例如 CGFloat 或 NSlnteger 等)的简单赋值操作。
assign 可以用非 OC 对象,而 weak 必须用于 OC 对象
8.如何让自己的类用copy修饰符?如何重写带copy关键字的setter?
若想令自己所写的对象具有拷贝功能,则需实现 NSCopying 协议。如果自定义的对象分为可变版本与不可变版本,那么就要同时实现 NSCopying 与 NSMutableCopying 协议。
实现 NSCopying 协议。该协议只有一个方法:
- (id)copyWithZone:(NSZone *)zone;
注意:一提到让自己的类用 copy 修饰符,我们总是想覆写copy方法,其实真正需要实现的却是 “copyWithZone” 方法。
9.深拷贝与浅拷贝
浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。
10.@protocol和category中如何使用@property
在 protocol 中使用 property 只会生成 setter 和 getter 方法声明,我们使用属性的目的,是希望遵守我协议的对象能实现该属性
category 使用 @property 也是只会生成 setter 和 getter 方法的声明,如果我们真的需要给 category 增加属性的实现,需要借助于运行时的两个函数:objc_setAssociatedObject和objc_getAssociatedObject
11.循环引用
循环引用的实质:多个对象相互之间有强引用,不能释放让系统回收。
如何解决循环引用?
避免产生循环引用,通常是将 strong 引用改为 weak 引用。 比如在修饰属性时用weak 在block内调用对象方法时,使用其弱引用