How ARC works ARC 的工作原理

当你习惯了苹果的命名方式之后,这就很好理解 arrayWithObjects, stringWithFormat, numberWithInteger 这几种创建出来的,都是会自动释放的对象。而当你使用 alloc, create, new, copy 或 mutableCopy 的时候,创建的就不是自动释放的对象,需要手动去释放它们。

正是由于这个严格的命名规则,我们可以引进 ARC 技术了。ARC 的工作原理是自动在编译的过程中调用 retain, release 和 autorelease,从而解放你的双手。其实你一旦打开了 ARC 的大门,也就不能再手动调用这些方法了。ARC 可以看到方法内部是如何运行的,保证内存不出现泄漏或超载的情况。

虽然不明显,但其实 Swift 也是使用 ARC 的,不明显是因为 initWith... 和 arrayWith... 两者已经没有区别了。但是有一个地方,这两种语言是非常相似的,就是处理强引用循环。ARC 没有办法解决,你要手动试用弱引用使来解决这个问题。

而且不论是 Objective-C 还是 Swift,所有对象都默认为 strong,但你可以手动设置为 weak。weak 属性是不增加引用计数的,也就是说,如果这个对象创建出来之后不被试用,在内存里它就会被销毁掉。举个例子:

@property (weak) SomeDataType *delegate;

在有 ARC 技术之前,Objective-C 开发者会使用 assign 属性来表示弱引用。但是 assign 和 weak 之间还是有区别的。一个 weak 属性,在最后被销毁的时候,它就会变成 nil。但是 assign 属性被销毁的时候,它会创建一个悬挂指针,这个指针会指向内存中的某一位置,这个位置是曾经储存 assign 属性这个位置。我之前说过,在 Objective-C 里,可以向 nil 发送消息,但是向一个不知道在内存什么地方的不知道什么东西发送消息,就是一个很糟糕的行为了。

你也可以在区块(block)里面用 weak 来打破强引用循环,但语法会发生一些变化,你要用的是 __weak。具体内容你可以翻回 block 这一章回顾一下。

小提示:我的建议是除非这个项目非常老,否则不要用 assign 来表示弱引用。

results matching ""

    No results matching ""