美文网首页
arc什么时候起作用?

arc什么时候起作用?

作者: Adam_潜 | 来源:发表于2018-10-29 18:28 被阅读44次

arc什么时候起作用?
arc就是让编译器进行内存管理, 编译器能立即释放不再被使用的对象, arc是编译时的特征.
自己持有的对象不再需要时释放。NSObject * __strong object = [NSObject alloc] init];
非自己持有的对象自己无法释放。 NSMutableArray * __strong array = [NSMutableArray array];

__strong 表示强引用,
对应定义 property 时用到的 strong。
当对象没有任何一个强引用指向它时,它才会被释放。
当需要释放强引用指向的对象时,需要保证所有指向对象强引用置为 nil。
__strong 修饰符是 id 类型和对象类型默认的所有权修饰符。

关于 __weak
__weak 表示弱引用,对应定义 property 时用到的 weak。
弱引用不会影响对象的释放,
当对象被释放的时, 所有指向它的弱引用都会被设为nil, 这样可以防止野指针.
__weak 最常见的一个作用就是用来避免强引用循环。

在 Block 中防止强引用循环。
定义block的时候使用 copy,因为 Block 要持有它原本所在作用域的其他外面的变量:

autoreleasing

  • (NSObject *)object {
    NSObject *o = [[NSObject alloc] init];
    return o;
    }
    所以一般情况下编译器会自动将其注册到 Autorelease Pool 中
    (注意这里是一般情况下,在一些特定情况下,ARC 机制提出了巧妙的运行时优化方案来跳过 autorelease 机制)。

为什么方法返回值的时候需要用到 autorelease 机制呢?

这涉及到两个角色的问题。一个角色是调用方法接收返回值的接收方。当参数被作为返回值 return 之后,接收方如果要接着使用它就需要强引用它,使它 retainCount +1,用完后再清理,使它 retainCount -1。有持有就有清理,这是接收方的责任。另一个角色就是返回对象的方法,即提供方。在方法中创建了对象并作为返回值时,一方面你创建了这个对象你就得负责释放它,有创建就有释放,这是创建者的责任。另一方面你得保证返回时对象没被释放以便方法外的接收方能拿到有效的对象,否则你返回的是 nil,有何意义呢。所以就需要找一个合理的机制既能延长这个对象的生命周期,又能保证对其释放。这个机制就是 autorelease 机制。

当对象作为参数从方法返回时,会被放到正在使用的 Autorelease Pool 中,
由这个 Autorelease Pool 强引用这个对象而不是立即释放,从而延长了对象的生命周期,
Autorelease Pool 自己销毁的时候会把它里面的对象都顺手清理掉,从而保证了对象会被释放。
但是这里也引出另一个问题:既然会延长对象的生命周期到 Autorelease Pool 被销毁的时候,
那么 Autorelease Pool 的生命周期是多久呢?会不会在 Autorelease Pool 都销毁了,接收方还没接收到对象呢?

相关文章

网友评论

      本文标题:arc什么时候起作用?

      本文链接:https://www.haomeiwen.com/subject/odkitqtx.html