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很多语法特性,它也借鉴了多种现代化语言的特点,在 ...
随机推荐
- CentOS 下 sftp 有人能连有人不能连 程序设定了禁用IP
问题现象: 局域网的一台Linux上运行有sftp Server. 大家用FileZilia 连接,有两个人能够连接,有两个人不能连接. 解决问题: 1.先查看服务器上的sftp server是哪一个 ...
- DevExpress TreeList 全选和反选 z
/// <summary> /// 全选树 /// </summary> /// <param name="tree">树控件</para ...
- ios项目上传svn丢失*.a文件
Win TortoiseSVN:鼠标右键-TortoiseSVN-Settings-General-Subversion-Golobal ignore pattern Win Subversion:编 ...
- C++ 快排
// 进行一轮快排并返回当前的中间数 int getMiddle( int* arr, int low, int high ) { auto swaparr = [&]( int i, int ...
- 使用delphi+intraweb进行微信开发3—微信消息处理
示例代码已经放出!请移步使用delphi+intraweb进行微信开发1~4代码示例进行下载,虽为示例代码但是是从我项目中移出来的,封装很完备适于自行扩展和修改. 在第二讲使用delphi+intra ...
- Latex感想
看人家,一个小女生,被导师逼着,首先对电脑方面理解不多,3天时间,latex已经把Paper框架建立起来,我可以说我自愧不如吗?德鲁克<卓有成效的管理者>说的一次干一件事情,<冬吴相 ...
- this关键字
class Demothis关键字//哪个对象在调用this所在的函数,this就代表哪个对象.{ //当定义类中功能时,该函数内部要用到该函数的对象时,这时用this来表示这个对象. public ...
- DMA控制
1.S3C6410中DMA操作步骤 S3C6410中DMA操作步骤:1.决定使用安全DMAC(SDMAC)还是通用DMAC(DMAC):2.开始相应DMAC的系统时钟,并关闭另外一组的时钟(系统默认开 ...
- (Hibernate进阶)Hibernate映射——多对多关联映射(八)
多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接开始. 映射原理 不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联.用第三张表来解决可能会造成数 ...
- 删除Json中的不需要的键值
var json = {'A': 1, ,'B': 2, 'ccc': 333} delete json['ccc'];