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修饰。
这些只是个人看法,如有错误,希望大家能帮忙修正
Swift 正式开源,同时开源 Swfit 核心库和包管理器
Swift 的详细介绍:请点这里