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)