Swift - 37 - 值类型和引用类型的简单理解
//: Playground - noun: a place where people can play import UIKit // 值类型:指的是当一个变量赋值给另外一个变量的时候, 是copy一个副本
// 两个变量之间互不影响, 也就是说, 另外一个变量的值改变, 不会影响到另外一个变量
// 也就是传的只是一个值, 不是一个引用(地址)
var a = 0
var b = a
b = 2
a // 闭包和函数都是引用类型
// 引用类型:指的是当引用类型变量赋值给另外一个变量的时候, 其实两个变量指的都是同一个内容
// 当其中一个变量修改了这个内容, 另外一个变量也会跟着改变
func calcTotalMiles(todayMiles: Int) -> () -> Int
{
var totalMiles = 0
return {
totalMiles += todayMiles; // 这个闭包用到了Capturing Values
return totalMiles
}
} var dailyTwoMiles = calcTotalMiles(2)
dailyTwoMiles()
dailyTwoMiles() var myPlan = dailyTwoMiles
myPlan()
myPlan() /*
同学A的理解:
var totalMiles = 0 这句是处在 calcTotalMiles 函数中。
而你说的每次调用,调用的并不是 calcTotalMiles 这个函数,
而是 calcTotalMiles 这个函数的返回值,也就是另一个函数。
返回的函数被命名为 dailyTwoMiles 或者 dailyThreeMiles,
返回函数的内容是闭包内容:{totalMiles += todayMiles; return totalMiles; },
其中并没有对 totalMiles 重置的语句,所以totalMiles不会被重置。
那么问题来了,totalMiles 什么时候被重置。
很简单,var totalMiles = 0 处在 calcTotalMiles 函数中,
当然是 calcTotalMiles 被调用时会被重置,
也就是
var dailyTwoMiles = calcTotalMiles(2) 和
var dailyThreeMiles = calcTotalMiles(3)
这两句在运行时会重置 titalMiles. 同学B的理解:
这里的关键是:calcTotalMiles返回了一个函数,这个函数以闭包的形式返回,我们没有给他起名,
这里姑且叫他resultFunction。要注意,这个resultFunction和calcTotalMiles不是一个东西,
resultFunction是calcTotalMiles的一个结果!
仔细看这个resultFunction函数体内,涉及的两个变量:totalMiles和todayMiles,
都没有在resultFunction里定义。那resultFunction是怎么拿到这个值的呢?
这个过程是swift使用一种称为Capturing Values的方式感知到的。与此同时,一点儿没有错,这将产生内存方面的问题。
在这里,你可以理解成,我们给calcTotalMiles传入一个参数,返回了一个函数resultFunction,
之后执行calcTotalMiles所使用的栈空间并没有被释放,因为产生的resultFunction还在使用(或者是拥有)调用者calcTotalMiles的内容。 我个人的理解是:
由于calcTotalMiles的返回值是resultFunction, 而resultFunction又引用着calcTotalMiles中的变量,
所以calcTotalMiles执行完之后并没有被销毁, 还保留在内存中...
所以当resultFunction再次调用的时候所拿到的totalMiles还没有被初始化..就会继续累加...
*/ // ps: 在实际中, 很少用到函数和闭包是引用类型这种情况, 这里仅仅作为了解...
Swift - 37 - 值类型和引用类型的简单理解的更多相关文章
- swift的值类型和引用类型
前言 最近在学设计模式中,发现 Swift 中的 struct,class 以及 enum 在一般的使用中能够做到互相替换,因此探究其背后的逻辑就十分有必要.而这一问题又引出了 Swift 中的值类型 ...
- 6个重要的.NET概念: - 堆栈,堆,值类型,引用类型,装箱和拆箱(转)
今天在Code Project上面看到一篇文章<6 important .NET concepts: - Stack, heap, Value types, reference types, b ...
- [No0000B5]C# 类型基础 值类型和引用类型 及其 对象判等 深入研究1
引言 本文之初的目的是讲述设计模式中的 Prototype(原型)模式,但是如果想较清楚地弄明白这个模式,需要了解对象克隆(Object Clone),Clone其实也就是对象复制.复制又分为了浅度复 ...
- Swift 值类型和引用类型
Swift中的类型分为两类:一,值类型(value types),每个值类型的实例都拥有各自唯一的数据,通常它们是结构体,枚举或元组:二,引用类型(reference types),引用类型的实例共享 ...
- Swift 值类型/引用类型
1.值类型/引用类型 在 Swift 语言中,所有的类型都可以被分为 "值类型" 或者 "引用类型",可以将其理解为函数参数传递的方式. 值类型表示的是将它传递 ...
- Swift - 值类型与引用类型的初步探究
前言 swift中的结构体和类在组成和功能上具有一定的相似性.两者都可以含有成员属性.成员方法用于数据存储和功能性模块封装.往往造成不知如何对二者进行区分和使用 值类型概念和引用类型概念 值类型的概念 ...
- C# - 值类型、引用类型&走出误区,容易错误的说法
1. 值类型与引用类型小总结 1)对于引用类型的表达式(如一个变量),它的值是一个引用,而非对象. 2)引用就像URL,是允许你访问真实信息的一小片数据. 3)对于值类型的表达式,它的值是实际的数据. ...
- 【译】.NET中六个重要的概念:栈、堆、值类型、引用类型、装箱和拆箱
为何要翻译 一来是为了感受国外优秀技术社区知名博主的高质量文章,二来是为了复习对.NET技术的基础拾遗达到温故知新的效果,最后也是为了锻炼一下自己的英文读写能力.因为是首次翻译英文文章(哎,原谅我这个 ...
- 图解C#的值类型,引用类型,栈,堆,ref,out
C# 的类型系统可分为两种类型,一是值类型,一是引用类型,这个每个C#程序员都了解.还有托管堆,栈,ref,out等等概念也是每个C#程序员都会接触到的概念,也是C#程序员面试经常考到的知识,随便搜搜 ...
随机推荐
- WinPcap编程(前言&&学习)
计算机网络课设要求用WinPcap写对ARP包的接收与发送. 所以学了一下WinPcap的内容. 参考的博客: http://blog.csdn.net/htttw/article/details/7 ...
- bzoj2487: Super Poker II
Description I have a set of super poker cards, consisting of an infinite number of cards. For each p ...
- Java I/O编程思路
我们在开发过程中不可避免遇到字符编码问题.遇到乱码问题的时候一定要保持清晰,网上很多关于字符编码集,这里我也就不介绍各种编码,这里我介绍自己编程中遇到字符编码问题时的思路. 乱码问题 无非就是 字节 ...
- windows环境下VS2013编译openSSL
openssl版本:1.0.2h 编译器:MSVC (VS2013) 需要准备工具:perl. windows环境的perl下载请戳这里:http://www.activestate.com/acti ...
- (转载)细说PHP中strlen和mb_strlen的区别
(转载)http://developer.51cto.com/art/201105/263103.htm 在PHP中,strlen与mb_strlen是求字符串长度的函数,但是对于一些初学者来说,如果 ...
- 【贪心+堆】XMU 1584 小明的烦恼
题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1584 题目大意: 给n(n<=100 000)个任务的耗时和截至时间,问最少不能 ...
- Nodejs in Visual Studio Code 01.简单介绍Nodejs
1.开始 作者自己:开发人员,Asp.Net , html / js , restful , memcached , oracle ,windows , iis 目标读者:供自己以后回顾 2.我看No ...
- 最受欢迎linux命令
1. 以 root 帐户执行上一条命令 sudo !! 2. 利用 Python 搭建一个简单的 Web 服务器,可通过 http://$HOSTNAME:8000访问 python -m ...
- HTTP学习笔记4-请求与响应结构例子
18,HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成.请求消息和响应消息都是由开始行,消息报头(可选的),空行(只有CRLF的行),消息正文(可选的)组成. 19,对于请求消息,开始行就 ...
- java并发ThreadLocal
ThreadLocal 实际就是一个map,一个线程对应一个local对象,线程创建时候,threadlocal随着创建,线程死亡ThreadLocal对象随着消失. runnable可以共享数据,要 ...