1、Swift中struct和class有什么区别?
在 Swift 中,struct(结构体)和 class(类)是两种用于定义自定义数据类型的方式,它们具有以下区别:
- 继承性:class 支持类的继承,可以通过创建子类来扩展现有的类,而 struct 不支持继承,但可以继承协议。struct 主要用于创建值类型。
- 值类型 vs 引用类型:struct 是值类型,而 class 是引用类型。值类型在赋值或传递给函数时会被复制,而引用类型则是传递引用。这意味着当修改一个值类型的实例时,会得到一个新的副本,而不会影响原始实例。而修改引用类型的实例将影响所有引用该实例的代码。
- 内存管理:class 使用引用计数(reference counting)来管理内存,当没有引用指向一个实例时,内存会被自动释放。而 struct 在栈上分配内存,不使用引用计数,当它超出作用域时,内存会自动释放。
- 默认成员初始化器:struct 自动获得默认的成员初始化器,该初始化器可以使用所有成员的默认值进行初始化。而 class 不会自动获得默认的成员初始化器,需要手动编写初始化器。
- 类型传递:struct 是通过值传递的方式进行赋值和传递,而 class 是通过引用传递的方式进行赋值和传递。
- 可变性:当使用 let 声明一个 struct 的实例时,该实例的属性也将变为不可变。而对于 class 的实例,即使使用 let 声明,仍然可以修改实例的可变属性。
在选择使用 struct 还是 class 时,需要根据具体的需求和场景进行考虑。如果需要继承性、共享实例、高级的内存管理或者使用 Objective-C 的特性,通常会选择使用 class。如果只需要简单的值类型、值语义、轻量级的实例、线程安全性,可以选择使用 struct。
2、Swift中的方法调用有哪些形式?
1.静态调用:在 Swift 中,静态方法调用是通过类型本身而不是实例来调用的。要定义静态方法,需要使用 static 关键字或 class 关键字。
2.函数表调用:在 Swift 中,函数类型的方法调用是通过将函数作为参数传递给其他函数或从函数类型的变量中调用的方式。
3.消息派发机制调用:在 Swift 中,动态派发适用于类和通过协议实现的方法,调用时会根据实例的实际类型来确定方法的实现。而静态派发适用于结构体和枚举类型的静态方法以及全局函数,调用时方法的实现在编译时就已经确定,不会受到实例的类型而改变。
3、Swift和OC有什么区别?
1.语法更加简洁。
2.Swift可以面向协议编程,函数式编程,面向对象编程,而OC主要面向对象编程,也可以进行函数式编程但要引入类似ReactiveCocoa的类库。
3.Swift是一门类型安全的语言。
4.值类型增强,不变性,独立性等。
5.枚举增强,有属性和方法,支持泛型,协议,扩展等。
6.Swift中支持泛型。
7.协议和扩展。
8.函数和闭包。
4、从OC向Swift迁移的时候遇到过什么问题?
5、怎么理解面向协议编程?
面向对象是以对象的视角观察整体结构,万物皆为对象。
面向协议则是用协议的方式组织各个类的关系,Swift底层几乎所有类都构建在协议之上。
面向协议能够解决面向对象的菱形继承,横切关注点和动态派发的安全性等问题。
6、内存分区
栈区:连续的内存区域,从高到低分配,先进后出,一般在运行时分配,存储局部变量,函数的参数;
堆区:不连续的内存区域,向高地址分配,先进先出,一般在运行时分配,由程序员动态分配和释放。
全局区:在编译时分配,存放未初始化的全局变量和未初始化的静态变量。
常量区:在编译时分配,存放已初始化的全局变量和已初始化的静态变量。
代码区:在编译时分配,存放程序运行时的代码,编译成二进制存进内存的,只准读,不可写。
7.iOS内存泄漏
代理委托用weak;
block中用 __weak;
NSTimer循环引用:使用新block方式创建定时器(iOS10),使用中间类NSProxy(消息转发),使用NSTimer的Category加block的方式,(最优的是使用GCD,基于系统内核);
GCD定时器
NSTimeInterval interval = 1.f;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), interval * NSEC_PER_SEC, 0);
__block NSInteger time = 5;
dispatch_source_set_event_handler(timer, ^{
NSLog(@"GCD Timer start");
if (time <= 0) {
dispatch_source_cancel(timer);
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"over");
});
}else {
time --;
}
});
dispatch_resume(timer);
WKWebView注入方法时也会存在循环引用,使用weak
Core Foundation中的类需要自己CFRelease
8.Masonry中的mas_equalTo和equalTo的区别:
equalTo仅支持基本类型,而mas_equalTo支持类型转换,支持复杂类型,是对equalTo的封装。
- Autoreleasepool自动释放池?
10.KVO,KVC?
11.weak的实现原理?
12.atomic和nonatomic的区别?
atomic原子性,但不能保证对象多线程安全,
13.系统默认关键字
-
基本数据:atomic,readweite,assign
-
OC对象:atomic, readwrite,strong
14.浅拷贝增加引用计数,不产生新的内存。
深拷贝不增加引用计数,会新分配内存
15.数组和字典的底层实现?
哈希表
16.数组和链表的区别?
17.向nil发送消息为什么不会crash?