高性能iOS应用开发(一):内存管理

2018-10-20  本文已影响5人  aaayia

自动释放池块

自动释放池块是允许你放弃对一个对象的持有关系, 但可以避免它立即被回收的一个工具,它确保在块内创建的对象会在块完成时被回收, 本地的块可以用来尽早的释放其中的对象。

iOS应用的整个代码都在一个autoreleasepool块中, 这意味着所有的对象autorelease最后都会被回收,不会导致内存泄漏

int main(int argc, char * argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([UIAppDelegate class]));
    }
}

在一些特定情况下使用autoreleasepool


变量限定符号

这是默认的限定符,无需显示引人。只要有强引用指向,对象就会长时间驻留在内存中。可以将_strong理解为retain调用的ARC版本。

这表明引用不会保持被引用对象的存活。当没有强引用指向对象时,弱引用会被置为nil。可将_ weak看作是assign操作符的ARC版本,只是对象被回收时,_ weak具有安全性, 指针将自动被设置为nil。

与weak 类似,只是当没有强引用指向对象时,__unsafe_unretained 不会被置为nil。可将其看作assign操作符的ARC版本。

__autoreleasing 用于由引用使用id *传递的消息参数。它预期了autorelease方法会在传递参数的方法中被调用。

使用这些限定符的语义如下:
TypeName * qualifier variable;

属性限定符

属性声明有两个新的特有关系限定符: strong和weak。

默认符,指定了__strong关系。

指定了__weak关系。

这不是新的限定符,但其含义发生了改变。在ARC之前,assign 是默认的持有关系限定符。在启用ARC之后,assign 表示了_unsafe_unretatned关系。

暗指了__strong关系。此外,它还暗示了setter中的复制语义的常规行为。

指定了__strong 关系。

unsafe. unretained关系。

避免循环引用的规则

iOS中引用计数的最大陷阱在于,不能处理环状的引用关系,即Objective-C的循环引用。

上一篇 下一篇

猜你喜欢

热点阅读