您的位置:首页 > 移动开发 > Swift

swift语言基础之:subscript下标、对象之间的循环强引用的处理方法

2015-09-24 19:21 337 查看
subscript是swift提供的可以快捷的访问对象属性的方式,它实际上是一种函数,目的是更方便地访问对象中的元素。

以上是官方定义,其实,subscript就是类的对象提供给外部的一个更加方便的联络点,我们可以通过像数组那样的格式,来访问对象中的属性

来感受下:

<span style="font-size:14px;">class Test{
   var testArray = Dictionary<Int,String>()
   subscript(index:Int) -> String{
      get{return testArray[index]}
      set{testArray[index] = newValue}
   }
}</span>


有了如上这段定义,我们就可以用下标[x]的格式来访问对象的属性,或者改写对象的属性~很方便~
<span style="font-size:14px;">var test = Test()
test[2] = "hello"
test[3] = "world"
print(test.testArray)
// 输出[3:world,2:hello]</span>


循环强引用的处理方法:使用weak和unowned即弱引用和无主引用。

循环强引用可能会导致内存泄漏,一块内存漂泊无依又不能被回收多惨啊,所以大家一定要小心处理这个~

由于swift采用的是自动引用计数ARC,每当我们为一个类创建一个对象实例,ARC就会热情的分配一大块内存给它,当它不再被使用的时候,ARC才会回收这块内存,挪作他用。而swift判断这块内存是否有用的根据,就是有多少引用指向这块内存,只有当引用数为0的时候,这块内存才能够被回收。注意,这里的引用指的是强引用。

但是有时候会出现酱紫的问题:一个类的对象的属性是另一个类的对象实例,而这另一个类的对象中有一个属性又指回了第一个类的对象。好混乱是吧。。。

举个栗子:

class Person,这个类有一个属性是:Apartment类的对象,(var address:Apartment)

class Apartment,这个类有一个属性是:Person类的对象。(var host:Person)

不做处理的话,那么,可以新建一个Person?类的对象john,一个Apartment?类的对象number200

如果john就住在number200房间的话,也就是:john!.address = number200

number200!.host = john

这可不妙了,这两个实例互相建立了强引用,就算日后你不想玩儿了,使得john=nil,number200 = nil,那两块内存依旧被对方的强引用指向着,所以内存无法被释放。多忧桑。

解决办法是,声明类的属性的时候,使用weak前缀:weak var host:Person?

这样,该引用就是弱引用,当Apartment类的对象number200和Person类的对象john被复制成nil时,swift对weak引用视而不见,那么久木有强引用指向Person类的对象john了,这块内存被释放,之后也就木有任何强引用指向number200了,于是两块内存都被回收到了系统温暖的怀抱~

完美解决~

和弱引用类似,无主引用unowned也会被swift视而不见,不同的是,无主引用总是被定义为非可选类型。也就是该变量不可以为空喔~

(weak var host:Person?--蒽,这个就是可选类型咯~变量host可以为nil)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: