OC和Swift的区别
- Swift更加安全,它是类型安全的语言,有类型推断,OC是动态语言
- Swift注重值类型,OC注重引用类型。
- Swift支持泛型
- Swift支持静态派发,动态派发(函数表派发、消息派发)方式,OC支持动态派发(消息派发方式)
- swift支持命名空间
- swift支持默认参数
- swift比oc代码更加简洁
Swift -Struct 与Class的区别
- 在Swift中类和结构体,都可以定义属性、方法、下标和初始化器。 struct 没有析构方法
- struct是值类型,class是引用类型, struc是存储在栈上,class是存储在堆上。
- class可以继承, 而struct不可以继承
- struct在func里面需要修改属性的时候需要加上 mutating 关键字,class就不用。
在Swift扩展里添加存储属性
在 Swift 的 Extension 里是不能添加存储属性的,这里可以类比 Objective-C的 Category 分类,分类是不能添加实例变量和属性的。
不管是 Swift 的 Extension 还是 Objective-C 的 Category 都不能改变原有的类或者结构体的内存结构,在实例化这些类的时候,内存结构是确定的,而添加属性或者实例变量需要内存空间,会改变原有的内存结构。
可以利用关联对象在 Extension 中添加计算属性,以达到所谓的存储属性的效果。
Swift关键字final
- final 用于限制继承和重写. 如果只是需要在某一个属性前加一个 final.
- 如果需要限制整个类无法被继承, 那么可以在类名之前加一个final
Swift中public和open的区别
这两个都用于在模块中声明需要对外界暴露的函数, 区别在于,
- public修饰的类在模块外无法继承,
- 而open则可以任意继承,
- 公开度来说, open > public
Swift 为什么将 Array,String,Dictionary,Set,设计为值类型?
值类型 相比 引用类型的优点
- 值类型和引用类型相比,最大优势可以高效的使用内存;
- 值类型在栈上操作,引用类型在堆上操作;
- 栈上操作仅仅是单个指针的移动,
- 堆上操作牵涉到合并,位移,重链接
Swift 这样设计减少了堆上内存分配和回收次数,使用 copy-on-write将值传递与复制开销降到最低。
String,Array,Dictionary设计成值类型,也是为了线程安全考虑。通过Swift的let设置,使得这些数据达到了真正意义上的“不变”,它也从根本上解决了多线程中内存访问和操作顺序的问题
Swift中的static或者class修饰符的作用
在struct中声明一个静态属性或者函数,使用static 修饰符
struct Test{
static func text(){
}
}
在Class类中使用static或者class修饰符, 都是可以的. 他们使用后的效果是一样, 但是本质上是不同的.
- 本质不同原因是:
static修饰的属性或者修饰的函数都不可以重写. 但是使用class修饰符, 可以重写.计算属性需要使用static - 当
static在类中应用的时候,static就成为class final的一个别名.
如何理解copy-on-write?
值类型(比如:struct),在复制时,复制对象与原对象实际上在内存中指向同一个对象,当且仅当修改复制的对象时,才会在内存中创建一个新的对象,
- 为了提升性能,Struct, String、Array、Dictionary、Set采取了Copy On Write的技术
- 比如仅当有“写”操作时,才会真正执行拷贝操作
- 对于标准库值类型的赋值操作,Swift 能确保最佳性能,所有没必要为了保证最佳性能来避免赋值