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很多语法特性,它也借鉴了多种现代化语言的特点,在 ...
随机推荐
- Webview获取H5页面js方法参数
#import<JavaScriptCore/JavaScriptCore.h> #pragma mark UIWebViewDelegate - (void)webViewDidFini ...
- vs 配置宏
Win_$(PROCESSOR_ARCHITECTURE)_$(PlatformArchitecture) <==> Win_x86_64 OR Win_x86_32$(Configura ...
- Django 之 查看执行的sql语句
前提: 我的app名称为core,models.py内容如下: # coding:utf-8 from django.db import models # Create your models her ...
- oleDB 导入excel遇到的问题
本地测试一切ok. 到服务器上测试各种报错,先装了office2010,又装了AccessDatabaseEngine,之后报"Microsoft Excel 不能访问文件 可能的原因有: ...
- oracle rac自动生成awr
cat awr.sql ######EXEC P_AWR_REPORT('201604251000', '201604251100', 'D_OUTPUT', '', FALSE); FALSE为ra ...
- IIS7.0上传文件限制的解决方法
在 Windows7(iis7.5).Win2008(iis 7.0)和Win2003(iis 6.0) 中,默认设置是特别严格和安全的,这样可以最大限度地减少因以前太宽松的超时和限制而造成的攻击. ...
- sql 删除重复数据且保留其中一条 用sql 关键字:with ROW_NUMBER
--1.建立表:Coursecreate table Course( ID int identity(1,1),--ID Student varchar(20) ,--学生 Sub varchar(2 ...
- Linux手动释放内存
手动释放内存 1.sync将内存中的缓存写入磁盘 2. to free pagecache, use echo 1 > /proc/sys/vm/drop_caches; to f ...
- C# 访问MongoDB 通用方法类
using MongoDB.Driver; using System; namespace MongoDBDemo { public class MongoDb { public MongoDb(st ...
- STL之序列容器vector
首先来看看vector的模板声明: template <class T, class Alloc = allocator<T>> class vector { //… }; v ...