初识Swift中的值和引用,循坏引用、代理的注意点

1.0 在Swift中分有值类型和引用类型

  Int 、String 、 结构体和枚举都属于值类型, 将值类型传递给方法是,将在内存中创建其副本,并传递这个副本;这样我们就可以随心所欲修改它,而不用担心这会修改传入的原始值。

  传递引用类型时不会复制它,而将其地址提供给可能使用他们的函数或方法。闭包以及从类实例化得到的对象都属于引用类型。将闭包或者对象传递给方法时,不会创建其副本,而是传递引用(内存地址)。由于传递引用类型时不会创建其副本,因此需要特别小心,确保在正确的时间妥善地释放它们,过早的释放内存,将会导致崩溃,过晚又会导致内存泄露。

2.0 引用循环

  在这里我们就用一个简单地例子,来简单的说明在开发中,怎么样会造成循环引用。

  例:一个人拥有一条狗,而狗拥有一个主人

  直接上代码  这里Person类里面拥有一个dog属性, 而deinit 相当OC中的dealloc函数

  这里Dog类里面有个主人。。。

在 main.swiftz中 我们这样使用

运行程序,我们会看到,输出台没有任何输出。。。。而当我们在它们其中一个类型中,在声明属性时 添加 weak 时,情况就会不一样。。如,运行程序,就会打印出,人被回收,狗被回收。。。

   从这个例子我们看以看出 在使用 var 声明时,默认是强引用,相当OC中的strong

   讲到这里 var 默认强引用,就想到代理

   一开始,我用Swift写代理是这么写的

个人感觉,没错啊,可是在OC环境下变成了

这时感觉,跟苹果的设计理念不同啊,一般代理属性都应该是 weak啊,然后我就找到了 var delegate : LMTablBarViewDelegate? 这句,在前面添加weak 之后,在看看变化 

这样终于是自己想要的结果。。。。所有我们在设置 代理属性时 应该 在前面 添加 weak修饰。

这些只是个人看法,如有错误,希望大家能帮忙修正

时间: 2024-10-29 04:57:23

初识Swift中的值和引用,循坏引用、代理的注意点的相关文章

Swift——(六)Swift中的值类型

在Swift中,结构体和枚举类型为值类型(Structures and Enumerations),在Stack Overflow上有这样一个问题:结构体中的可变属性只有在使用mutating关键字之后才能被内置的方法修改(如果是不可变属性肯定不可以修改了,这就不用纠结了,不过在Swift中,还有一个例外,那就是构造器Initialization,对于结构体和类的常量实例属性可以在构造器中进行设置,这感觉有点违背常量属性的含义,仔细想想也可以理解,因为实例化的时候,最后调用的是构造器,所以在构造

C++中的值传递 指针传递 和 引用传递

C++中参数传递有三种:传递参数值.传递参数地址.传递参数的引用. 一.概念分解 1. 值 2. 指针 指针从本质上讲 就是存放 变量地址的 一个变量, 在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向地址中所存放的数据的改变. 3. 引用 引用是一个别名,在逻辑上不独立,它的存在具有依附性,所以引用必须在一开始就被初始化,而且在其生命周期中是不能改变的其引用的对象(即不能重新赋值,自始至 至终都只能依附于同一个变量) 二.概念详解 1. 值传递: 形参是实参的拷贝,改变形参的值

Swift 中的值类型与引用类型

顶级修饰 次级修饰 赋值类型 存储类型 值类型 值类型   深拷贝 栈 值类型 引用类型 浅拷贝 堆 引用类型 值类型 浅拷贝 堆 引用类型 引用类型 浅拷贝 堆 复合引用类型会改变内部值类型的存储行为. 以上内容为推测 原文地址:https://www.cnblogs.com/feng9exe/p/9679909.html

swift中闭包 OC中Block 解决循环引用

OC 中 全局宏定义 #define WS(weakSelf)  __weak __typeof(&*self)weakSelf = self; 用法如下: WS(weakself) [self.tableView addHeaderWithCallback:^{ [weakself requestMemberList]; }]; swift 在比闭包 中使用 weakSelf weak var weakSelf = self demo4 {     // 使用?的好处 就是一旦 self 被释

为什么大家都说Java中只有值传递?

最近跟Java中的值传递和引用传递杠上了,一度怀疑人生.查了很多资料,加上自己的理解,终于搞清楚了,什么是值传递和引用传递.也搞明白了,为什么大家都说Java只有值传递,没有引用传递.原来,我一直以来的认知都是错误的... 首先,需要了解一些概念性的东西. 形参与实参: 形参,是指在定义函数时使用的参数,目的是用于接收调用该函数时传入的参数.简单理解,就是所有函数(即方法)的参数都是形参. 实参,是指调用函数时,传递给函数的参数. public static void main(String[]

Swift——(五)Swift中的那些默认值

在Swift语言中,有很多默认值,这里将常用的总结,欢迎补充. @Author: twlkyao 1.函数(方法)形参 在函数(方法)中,形参默认是常量,这主要是为了防止误操作,在调用函数(方法)时改变了实参的值,所以使用常量,如果想在函数内部对实参进行修改,可以使用var关键字进行标识,但是这并没有结束,如果想在函数(方法)调用结束之后仍然可以使用修改后的值,需要使用inout关键字进行标识,同时不要使用var对形参进行标识,在调用函数(方法)的时候,传递的实参,需要使用"&"

Java中的值传递和引用传递

解释 1.Java中有没有引用传递? 答:Java中只有按值传递,没有按引用传递! 2.当一个对象被当作参数传递到一个方法中后,在此方法中可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递. Java参数,不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,但是说传副本更好理解吧,传值通常是相对传址而言).如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的,如果在函数中改变了副本

java中参数传递--值传递,引用传递

java中的参数传递--值传递.引用传递 参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递. 在 Java 应用程序中永远不会传递对象,而只传递对象引用.因此是按引用传递对象.Java 应用程序按引用传递对象这一事实并不意味着 Java 应用程序按引用传递参数.参数可以是对象引用,而 Java 应用程序是按值传递对象引用的. Java 应用程序中的变量可以为以下两种类型之一:引用类型或基本类型.当作为参数传递给一个方法时,处理这两种类型的方式是相同的.两

swift中闭包的循环引用

首先我们先创造一个循环引用 var nameB:(()->())? override func viewDidLoad() { super.viewDidLoad() let bu = UIButton(type: .ContactAdd) bu.addTarget(self, action: "tap", forControlEvents: .TouchUpInside) view.addSubview(bu) run { print("name") sel