编程知识 购物 网址 新闻 笑话 | 软件 日历 阅读 图书馆 China
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程 CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流
站长资讯 .NET新手 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA VisualStudio ASP.NET-MVC .NET控件开发 EntityFramework WinRT-Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动 Html-Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP OracleERP DynamicsCRM K2 BPM 信息安全 企业信息 Android开发 iOS开发 WindowsPhone WindowsMobile 其他手机 敏捷开发 项目管理 软件工程 SQLServer Oracle MySQL NoSQL 其它数据库 Windows7 WindowsServer Linux
   -> Swift -> 内存相关 -> 正文阅读

[Swift]内存相关

/*
 Swift内存管理:
 1.管理引用类型的内存, 不会管理值类型, 值类型不需要管理;
 2.内存管理原则: 当没任何强引用指向对象, 系统会自动销毁对象(默认情况下所有的引用都是强引用);
 3.如果做到该原则: ARC 自动回收内存
 */
class Person {
    var name:String
    init(name:String) {
        self.name = name
    }
    deinit {
        print("Person deinit")
    }
}
var p:Person? = Person(name: "xiaohange")
//p = nil
/** weak弱引用 **/
class Person2 {
    var name:String
    init(name:String) {
        self.name = name
    }
    deinit {
        print("Person2 deinit")
    }
}
//强引用, 引用计数+1
var strongP = Person2(name: "hjq") //1
var strongP2 = strongP //2
//1.弱引用, 引用计数不变;
//2.如果利用weak修饰变量, 当对象释放后会自动将变量设置为nil;
//3.所以利用weak修饰的变量必定是一个可选类型, 因为只有可选类型才能设置为nil.
weak var weakP:Person2? = Person2(name: "hjq")
if let p = weakP{
    print(p)
}else{
    print(weakP as Any)
}
/*
 unowned无主引用, 相当于OC unsafe_unretained
 unowned和weak的区别:
 1.利用unowned修饰的变量, 对象释放后不会设置为nil, 不安全;
   利用weak修饰的变量, 对象释放后会设置为nil;
 2.利用unowned修饰的变量, 不是可选类型; 利用weak修饰的变量, 是可选类型;
 什么时候使用weak?
 什么时候使用unowned?
 */
class Person3 {
    var name:String
    init(name:String) {
        self.name = name
    }
    deinit {
        print("Person3 deinit")
    }
}
unowned var weakP3:Person3 = Person3(name: "hjq")
/*
 循环引用:
 ARC不是万能的, 它可以很好的解决内存问题, 但是在某些场合不能很好的解决内存泄露问题;
 例如: 两个或者多个对象之间的循环引用问题
 */
//例1:
class Apartment {
    let number:Int      //房间号
    var tenant:Person4? //租客
    init(number:Int) {
        self.number = number
    }
    deinit {
        print("\(self.number) deinit")
    }
}
class Person4 {
    let name:String
    weak var apartment: Apartment? //公寓
    init(name:String) {
        self.name = name
    }
    deinit {
        print("\(self.name) deinit")
    }
}
var p4:Person4? = Person4(name: "han")
var a4:Apartment? = Apartment(number: 888)
p4!.apartment = a4 //人有一套公寓
a4!.tenant = p4!   //公寓中住着一个人
// 两个对象没有被销毁, 但是我们没有办法访问他们了, 这就出现了内存泄露!
p4 = nil
a4 = nil
//例2:
class CreaditCard {
    let number:Int
    //信用卡必须有所属用户;
    //当某一个变量或常量必须有值, 一直有值, 那么可以使用unowned修饰
    unowned let person:Person5
    init(number:Int, person:Person5) {
        self.number = number
        self.person = person
    }
    deinit {
        print("\(self.number) deinit")
    }
}
class Person5 {
    let name:String
    var card:CreaditCard? //人不一定有信用卡??
    init(name:String) {
        self.name = name
    }
    deinit {
        print("\(self.name) deinit")
    }
}
var p5:Person5? = Person5(name: "XiaoHange")
var cc:CreaditCard? = CreaditCard(number: 18888, person: p5!)
p5 = nil
cc = nil
  Swift 最新文章
GCD(Swift)
CAScrollLayer
swift3.0  代码创建经典界面的九宫图
Swift Podfile中的 use_frameworks!
常用的 74个内置函数
swift内存管理中的引用计数
函数参数
聊天界面
内存相关
ios8 UITableView设置 setSeparatorInset:U
上一篇文章      下一篇文章      查看所有文章
加:2017-08-15 23:25:13  更:2017-08-15 23:25:17 
 
360图书馆 软件开发资料 购物精选 新闻资讯 Chinese Culture 三丰软件 开发 中国文化 阅读网 日历 万年历 2019年11日历
2019-11-19 4:13:29
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  编程知识