IOS系列swift语言之课时八
这节课需要讲的就是可选链,内存管理,引用计数,unowned解决
//: Playground - noun: a place where people can play import UIKit
//可选链(optional chain)
//class A {
// var p: B?
//
//}
//
//class B
//{
// var p: C?
//}
//
//class C {
// func cm() -> String {
// print("cm")
// return "abc"
// }
//}
//
//let insa = A()
//let insb = B()
//let insc = C()
//insa.p = insb
//insb.p = insc
//let insb = insa.p
//var insc: C?
//if insb != nil {
// insc = insb?.p
//}
//
//if insc != nil {
// insc?.cm()
//}
//中间任何一个地方为nil,不报错,但导致整个结果为nil
//如果没有一个地方为nil,整个表达式正常运行
//if let r = insa.p?.p?.cm() {
// print(r)
//} /*
swift中的或者java,c#语言的内存管理,指的就是引用类型对象的管理
这三个语言,值类型不需要进行内存管理,值类型是放在栈里的,程序会自动管理,不需要特别的机制 三种语言的内存管理,值得就是对“堆(heap)”里面的对象的管理 swift中的内存管理技术,叫做arc,自动引用计数(Auto Reference Count)
但对对象的引用计数为0时,立即销毁对象 这种管理一般会产生两种错误可能
1.空引用
2.内存泄露(leak)
某个时候,某些对象分配了内存,但因为某些原因,导致程序结束时,此对象所占的内存没有被回收
我们可以控制的引用计数的数量
增加的方法
1.声明变量,指向某个对象(直接new或者把别的变量的值赋值给你 ) 减少的方法
1.f = nil(表示不指向任何东西)
2.变量一般会运行在函数中,变量本身是存放在栈中的
所以函数结束时,此变量消失 关于循环引用swift提供了两种方法来解决,一种是weak(弱),一种是unowned(未拥有)
1.weak 可以修饰在可为空(?,!)的属性上
2.unowned只能修饰在非可为空的属性上。 */
//class A {
// var p: B?
// init() {
// print("a********************")
// }
// deinit {
// print("a-----------------")
// }
//}
//
//class B{
// var p: A?
// init() {
// print("bbbb********************")
// }
// deinit {
// print("bbbbbb-----------------")
// }
//
//}
//下面说明的是计数的问题
//let f1 = A() //此时A对象有一个引用
//var f1: A? = A() //此时A对象有一个引用
//var f2: A? = f1 //此时A对象有二个引用
//f1 = nil
//f2 = nil
//A()
//func test () {
// let aaaa = A()
// //aaaa.xxxxxxx
//
//} //函数结束时,aaaa变量不存在了,所以没有东西指向A()对象
//test() //下面说明的是循环引用的问题,导致的leak
//var insa: A? = A()
//var insb: B? = B()
//
//insa?.p = insb
//insb?.p = insa
//
//insa = nil
//insb = nil //下面演示解决办法
//class A {
// var p: B?
// init() {
// print("a********************")
// }
// deinit {
// print("a-----------------")
// }
//}
//
//class B{
// var p: A?
// init() {
// print("bbbb********************")
// }
// deinit {
// print("bbbbbb-----------------")
// }
//
//}
//
//var insa: A? = A()
//var insb: B? = B()
//
//insa?.p = insb
//insb?.p = insa //insb = nil
//
//insa = nil //----------unowned解决--------------------- //class A {
// var p: B?
// init() {
// print("a********************")
// }
// deinit {
// print("a-----------------")
// }
//}
//
//class B{
// unowned var p: A
// init(a: A) {
// print("bbbb********************")
// p = a
// }
// deinit {
// print("bbbbbb-----------------")
// }
//}
//
//var insa: A? = A()
//var insb: B? = B(a: insa!)
//insa?.p = insb
//insa = nil
//insb = nil //闭包的循环引用问题与解决
class ClosureDemo {
var name = "asdfas" // lazy var getName:()-> Void = {
// [unowned self] in
// //let name = "def"
// print(self.name)
// } var getName2: ()-> Void {
get { return {
[unowned self] in
//let name = "def"
print(self.name)
}
} } deinit {
print("closure-----------------")
}
} var cd: ClosureDemo? = ClosureDemo()
//cd?.getName()
//cd = nil cd?.getName2()
cd = nil
到这里,swift语言基础的知识就结束了,之后我们就开始进行UI的学习.
IOS系列swift语言之课时八的更多相关文章
- IOS系列swift语言之课时二
今天我们要讲的就是函数[对于函数,在最后面还有几道题,喜欢的博友可以看了自己做一下,和我交流一下] 当然这与我们的c语言还是有一定的共同之处的,对于有一些c语言或者是java基础的童鞋,我觉得是很容易 ...
- IOS系列swift语言之课时三
今天需要掌握的内容就是:闭包.类.结构体.属性(计算属性和延迟属性) 同样里面有一些题目,有兴趣的可以做一下. 首先我们需要知道什么是闭包?所谓的闭包就是一个代码块(一般是指函数以及被它捕获的成员变量 ...
- IOS系列swift语言之课时七
这下需要掌握的就是类型转换,类的构造器,判断类型,异常,异常的处理,defer,范型,约束加速刷代码 import Foundation /* 类型转换 1.利用类的构造器进行转换 2.系统可能提供一 ...
- IOS系列swift语言之课时六
这节课需要讲的就是协议,方法,委托模式(依赖倒转) 代码刷起中...... // // main.swift // ExAndProtocol // // Created by David on 23 ...
- IOS系列swift语言之课时五
过了几天没来理博客了,这次我们要讲的有:类,属性,初始化init(),初始化器,构造器等 直接刷代码了....... //: Playground - noun: a place where peop ...
- IOS系列swift语言之课时四
今天我们要讲的主要有:下标.可为空的类型.枚举(特殊的枚举:递归枚举).原生值.关联值 首先来分析一下这个下标,就是说我们可以通过下标找到对应的值或者是改变对应的值. 其次是可为空的类型,我们要牢记所 ...
- iOS之Swift语言的学习
好久都没有来这个熟悉而又陌生的地方啦, 想想已经有两三个月了吧,不过我相信以后还是会经常来的啦,因为忙碌的学习已经过去啦,剩下的就是要好好的总结好好的复习了,好好的熟悉下我们之前学习的知识点,将他们有 ...
- iOS使用Swift语言检查并提示更新
项目要上线了,产品要求跟安卓一样,一进去有一个提示框提示更新.虽然苹果在 Settings/iTunes Store & App Store 选项中有自动更新这一选项,而且添加版本号等等有被拒 ...
- iOS开发系列--Swift语言
概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...
随机推荐
- 在sql脚本中获取变量中的查询结果
)--变量 ) set @itemValue='select @a=getdate()'--赋值 exec sp_executesql @itemValue,N'@a nvarchar(max) ou ...
- Sql Server分割字符串函数
-- Description: 分割字符串函数 -- SELECT * FROM dbo.Split('a,b,c,d,e,f,g',',') -- ========================= ...
- 常用SQL语句
一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- ...
- java GC的优化
参考网摘: http://www.360doc.com/content/13/0305/10/15643_269388816.shtml
- CentOS 7安装Sublime text3
最近使用centos7,发现桌面有了大的改善,完全能够使用桌面进行开发.现在进行sublime text3的安装. 官网下载只有windows,ios,ubuntu这几个类型,我们选择ubuntu64 ...
- 第五届山东ACM大赛汇总
A.angry_birds_again_and_again 简单积分: http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem& ...
- 查看MS SQL SERVER 错误日志
查看目的: 错误日志的查看是确保过程已成功完成(例如,备份和恢复操作,批处理命令,或其他脚本和过程).这可以帮助检测任何当前或潜在的问题,包括自动恢复信息(尤其是如果SQL Server实例已停止并重 ...
- 利用MyEclipse自动生成POJO和配置文件
1.选择MyEclipse菜单的window菜单的Open Perspective,选择MyEclipse Database Explorer,如图所示. 2.在MySql上面点击右键,选择eidt. ...
- 封装tip控件
在界面上有时需要显示一个提示,大多的前端框架都把提示做成一个带有小尖角的提示框,因此自己也仿照了实现了一下,效果图如下: 尖角的实现很简单的,一般都是通过css将div的宽高设置为0,然后将尖角朝向的 ...
- Webpack 入门指南 - 2.模块
这一次我们谈谈模块问题. 通常我们希望这个项目可以分为多个独立的模块,比如,上一次提高的 hello 函数,如果我们定义为一个模块,其它模块引用之后,直接调用就好了.在前端怎么使用模块呢?这可说来话长 ...