iOS Principle:NamedTypes(下)

简介: iOS Principle:NamedTypes(下)

测试2:创建1000_000 个对象或者结构体放在数组中,查看内存占用率


a.循环创建1000_000个对象

class StudentC{
    var name:String
    init( name:String) {
        self.name = name
    }
}
var students:[StudentC] = []
// 创建
for i in 0...1000_000{
let s = StudentC(name: "酷走天涯")
students.append(s)
}


运行结果:


内存占用61.8MB

b.循环创建1000_000个结构体

struct StudentS{
    var name:String
    init( name:String) {
        self.name = name
    }
}
var students:[StudentS] = []
for i in 0...1000_000{
let s = StudentS(name: "酷走天涯")
students.append(s)
}


运行结果:


内存占用32.6MB

照样,我们将基本属性改为对象继续测试

c.10_000_000 个对象添加到数组中


class StudentC{
    var date = NSDate()
}
var students:[StudentC] = []
for i in 0...10_000_000{
    let s = StudentC()
    students.append(s)
}

测试结果:

占内存538.7MB


d.10_000_000 个结构体添加到数组中

struct StudentS{
    var date = NSDate()
}
for i in 0...10_000_000{
    let s = StudentS()
    students.append(s)
}


测试结构:

占用225.7MB

结论:创建相同属性的结构体比类更加节省内存


测试3:对1_000_000个结构体实体和对象进行排序,测消耗时间

a.对1_000_000个结构体实体进行排序

let date = Date()
students.sort { (stu1, stu2) -> Bool in
    return stu1.name > stu2.name
}
print(Date().timeIntervalSince(date))


运行结果:

13.3783949613571 13.6793909668922

b.对1_000_000个对象进行排序

let date = Date()
students.sort { (stu1, stu2) -> Bool in
    return stu1.name > stu2.name
}
print(Date().timeIntervalSince(date))


运行结果:

6.70881998538971 6.60394102334976

结论: 在数据量比较大的排序中,结构体排序的速度比较慢,因为结构体是值类型,排序的时候,需要大量的赋值运算。而对象只需要交换地址即可。


对比总结


枚举、结构体、类的共同点:

  • 定义属性和方法;
  • 下标语法访问值;
  • 初始化器;
  • 支持扩展增加功能;
  • 可以遵循协议;


结构体、类的不同点:

  • 类可以继承,结构体不能继承;
  • 类能够在运行时检查和解释类实例的类型;
  • Deinitializers使一个类的实例来释放任何资源分配;
  • 类有引用计数,允许对象被多次引用;


类特有的功能:

  • 继承;
  • 允许类型转换;
  • 析构方法释放资源;
  • 引用计数;


如何选择使用:

当你使用Cocoa框架的时候,很多API都要通过NSObject的子类使用,所以这时候必须要用到引用类型class。在其他情况下,有下面几个准则:


1.什么时候该用值类型:

  • 要用==运算符来比较实例的数据时
  • 你希望那个实例的拷贝能保持独立的状态时
  • 数据会被多个线程使用时


2.什么时候该用引用类型(class):

  • 要用==运算符来比较实例身份的时候
  • 你希望有创建一个共享的、可变对象的时候


3.类和结构体在效率上的差异:

结构体创建速度,内存占用更小,如果需要使用复杂的运算,这个时候,就需要综合考虑两者的有缺点了。

以上文章整理自:https://www.jianshu.com/p/51f99a352838http://www.cocoachina.com/swift/20161221/18377.html



目录
相关文章
|
iOS开发
iOS Principle:CGAffineTransform
iOS Principle:CGAffineTransform
191 0
iOS Principle:CGAffineTransform
|
安全 Unix API
iOS Principle:CALayer(下)
iOS Principle:CALayer(下)
182 0
iOS Principle:CALayer(下)
|
iOS开发
iOS Principle:CALayer(中)
iOS Principle:CALayer(中)
158 0
iOS Principle:CALayer(中)
|
API C语言 iOS开发
iOS Principle:CALayer(上)
iOS Principle:CALayer(上)
187 0
iOS Principle:CALayer(上)
|
存储 缓存 iOS开发
iOS Principle:weak
iOS Principle:weak
201 0
iOS Principle:weak
|
存储 iOS开发
iOS Principle:Notification(下)
iOS Principle:Notification(下)
125 0
iOS Principle:Notification(下)
|
设计模式 iOS开发
iOS Principle:Notification(上)
iOS Principle:Notification(上)
141 0
iOS Principle:Notification(上)
|
Web App开发 JSON 移动开发
iOS Principle:ReactNative(下)
iOS Principle:ReactNative(下)
198 0
iOS Principle:ReactNative(下)
|
移动开发 前端开发 JavaScript
iOS Principle:ReactNative(中)
iOS Principle:ReactNative(中)
128 0
iOS Principle:ReactNative(中)
|
移动开发 开发框架 自然语言处理
iOS Principle:ReactNative(上)
iOS Principle:ReactNative(上)
147 0