swift学习笔记(三)关于拷贝和引用

在swift提供的基本数据类型中,包括Int ,Float,Double,String,Enumeration,Structure,Dictionary都属于值拷贝类型。

闭包和函数同属引用类型

捕获则为拷贝。捕获即定义这些常量和变量的原作用域已不存在,闭包仍然可以在闭包函数体内引用和修改这些值

class属于引用类型。

Array的情况稍微复杂一些,下面主要对集合类型进行分析:

一、关于Dictionary:无论何时将一个字典实例赋给一个常量,或者传递给一个函数方法时,在赋值或调用发生时,都会发生拷贝。

如果字典实例中存储的keys和Value是值类型,当赋值或调用发生时,他们都会被拷贝。

如果keys和Value中存储的是引用类型,再拷贝时,拷贝的也是引用,而不是引用对应的类实例或函数。

二、关于Array:

因为Array能提供接近C语言的性能,并且拷贝行为只会在必要的时候才会发生。

通常情况下,将一个数组赋值给一个常量或变量的时候,传递的是引用,而不是拷贝的副本。

只有在以下情况下才会发生值拷贝:数组的长度大小有可能被改变时,及对数组进行插入,增加,删除或者使用范围下标去替换这一范围内的元素时,才会引起数组的值拷贝。

当拷贝发生时,其拷贝方式,与字典的拷贝方式相同。

注意:当使用下标语法,修改数组的内容时,不会引起数组的拷贝。因为下标语法并不会引起数组长度的改变,改变的只是数组的内容。

当操作一个数组时,或将其传递给函数以及方法调用时,很有必要确定这个数组是一个唯一的拷贝。

特别是当一个数组被多个变量引用时,只需要对一个变量,进行unshare操作,即可保证此变量为次数组的一个独立拷贝。

unshare与copy的区别:

unshare被调用时,仅在确有必要时才会创建数组的拷贝

copy属于强制拷贝,会在任何时候都创建一个新的拷贝,即使引用已经是一个唯一引用。

所以,如果仅需要保证你对数组的引用是唯一引用,请调用unshare方法,而不是copy方法

swift学习笔记(三)关于拷贝和引用,布布扣,bubuko.com

时间: 06-21

swift学习笔记(三)关于拷贝和引用的相关文章

swift学习笔记(七)自动引用计数

与Object-c一样,swift使用自动引用计数来跟踪并管理应用使用的内存.当实例不再被使用时,及retainCount=0时,会自动释放是理所占用的内存空间. 注:引用计数仅适用于类的实例,因为struct和enumeration属于值类型,也就不牵涉引用,所以其存储和管理方式并不是引用计数. 当一个实例被初始化时,系统会自动分配一定的内存空间,用于管理属性和方法.当实例对象不再被使用时,其内存空间被收回. swift中的引用类型分为三种,即Strong强引用,weak弱引用和无主引用unw

Swift学习笔记(三):Protocols and Delegates

一.协议 | Protocols 协议用于定义完成某些功能所需要的方法和属性,协议本身并不提供这些功能的具体实现,只是用来描述这些实现.类.结构体.枚举通过提供协议所要求的方法.属性的具体实现来采用协议.能够满足协议要求的类型称之为协议的遵循者. 协议可以要求遵循者提供特定的实例属性.实例方法.类方法.操作符或下标脚本等. //创建一个协议,协议说声明了一个方法Speak protocol Speaker { func Speak() } //类Vicki遵循Speaker协议,在类中具体实现了

Swift学习笔记:类和结构

一.类和结构的异同 类和结构有一些相似的地方,它们都可以: 1. 定义一些可以赋值的属性: 2. 定义具有功能性的方法 3. 定义下标,使用下标语法 4. 定义初始化方法来设置初始状态 5. 在原实现方法上的可扩展性 根据协议提供某一特定类别的基本功能 1. 类还有一些结构不具备的特性: 2. 类的继承性 3. 对类实例实时的类型转换 4. 析构一个类的实例使之释放空间 5. 引用计数,一个类实例可以有多个引用 1. 定义语法 struct Name{ let firstName = "&quo

Swift学习笔记七:闭包

闭包可以 捕获 和存储其所在上下文中任意常量和变量的引用. Swift 会为您管理在 捕获 过程中涉及到的内存操作. 在 函数 章节中介绍的全局和嵌套函数实际上也是特殊的闭包,闭包采取如下三种形式之一: 1. 全局函数是一个有名字但不会捕获任何值的闭包 2. 嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包 3. 闭包表达式是一个可以捕获其上下文中变量或常量值的没有名字的闭包 一.闭包表达式 闭包函数类似于Objective-C中的block.下面我们用事实说话: let counts =

Swift学习笔记(一):基础

一.常量 & 变量 //常量 let constantsTeam = 1 //变量 var variablesTeam = 2 尽可能使用常量,这样更清晰并且内存更不容易肾亏. 二.显示/隐式指定类型 //隐式 let inferredTeam = 3 //显式 let explicitTeam:Int = 4 三.字符串输出 //通过\(变量或常量名)来引用组合字符串 println("\(inferredTeam) is bigger than \(variablesTeam)!&q

Swift学习笔记(11)--类与结构体

类与结构是编程人员在代码中会经常用到的代码块.在类与结构中可以像定义常量,变量和函数一样,定义相关的属性和方法以此来实现各种功能. 和其它的编程语言不太相同的是,Swift不需要单独创建接口或者实现文件来使用类或者结构.Swift中的类或者结构可以在单文件中直接定义,一旦定义完成后,就能够被直接其它代码使用. 注意:一个类的实例一般被视作一个对象,但是在Swift中,类与结构更像是一个函数方法,在后续的章节中更多地是讲述类和结构的功能性. 1.类和结构的异同 类和结构有一些相似的地方,它们都可以

Swift学习笔记(12)--数组和字典的复制

Swift中,数组Array和字典Dictionary是用结构来实现的,但是数组与字典和其它结构在进行赋值或者作为参数传递给函数的时候有一些不同. 并且数组和字典的这些操作,又与Foundation中的NSArray和NSDictionary不同,它们是用类来实现的. 注意:下面的小节将会介绍数组,字典,字符串等的复制操作.这些复制操作看起来都已经发生,但是Swift只会在确实需要复制的时候才会完整复制,从而达到最优的性能. 字典的赋值和复制操作 每次将一个字典Dictionary类型赋值给一个

Ninject学习笔记<三>

ASP.NET MVC学前篇之Ninject的初步了解 1.介绍 废话几句,Ninject是一种轻量级的.基础.NET的一个开源IoC框架,在对于MVC框架的学习中会用到IoC框架的,因为这种IoC开源框架有很多,本篇的主题只有一个,就是让阅读过本篇幅的朋友逗知道IoC框架在项目中的作用,以及它的重要性. 这样做的目的是以便在以后的学习工作中选择自己中意的一个IoC框架来学习.使用,或者是自己去实现一个.好了,不废话了. 2.环境准备 1.新建个4.0Framework的一个控制台应用程序项目,

Swift学习笔记(4)--字符串及基本使用

String是例如"hello, world","海贼王" 这样的有序的Character(字符)类型的值的集合,通过String类型来表示. Swift 的String类型与 Foundation NSString类进行了无缝桥接.如果您利用 Cocoa 或 Cocoa Touch 中的 Foundation 框架进行工作.所有NSString API 都可以调用您创建的任意String类型的值.除此之外,还可以使用本章介绍的String特性.您也可以在任意要求传