美文网首页
ARC环境下的内存管理

ARC环境下的内存管理

作者: senpaiLi | 来源:发表于2020-02-19 14:24 被阅读0次
    一、ARC强制实施的新规则

    为了工作,ARC强加了一些在使用其他编译器模式时不存在的新规则。
    这些规则旨在提供一个完全可靠的内存管理模型;
    在某些情况下,它们只是强制执行最佳实践,在另一些情况下,它们简化了您的代码,或者是您不必处理内存管理的明显推论。
    如果您违反了这些规则,就会立即出现编译时错误,而不是在运行时可能变得明显的微妙错误。

    1、不能显式地调用dealloc,实现或调用retain, release, retainCount, or autorelease。
    @selector(retain), @selector(release)之类的也同样禁用。
    如果需要管理释放实例变量以外的资源,则可以实现dealloc方法
    2、不能使用NSAllocateObject 和 NSDeallocateObject
    3、不能在C结构中使用对象指针
    4、id和* void不能随意的使用
    5、不能使用NSAutoreleasePool对象,改为@autoreleasepool
    6、不能直接使用内存空间

    二、ARC引入了新的生命周期修饰词

    ARC介绍了对象的几个新的生存周期修饰词,还有弱引用。弱引用不会延长它指向的对象的生存期,当没有对对象的强引用时,自动指向nil。

    补充:autorelease 原理

    https://blog.sunnyxx.com/2014/10/15/behind-autorelease/
    https://juejin.im/post/5d807672f265da03c721d541

    小总结:
    查询得知:以 alloc, copy, ,mutableCopy和new这些方法会被默认标记为 __attribute((ns_returns_retained)) ,以这些方法创建的对象,编译器在会在调用方法外围要加上内存管理代码retain/release,所以其在作用域结束的时候就会释放,而不以这些关键字开头的方法,会被默认标记为__attribute((ns_returns_not_retained)),编译器会在方法内部自动加上autorelease方法,这时创建的对象就会被注册到自动释放池中,同时其释放会延迟,等到自动释放池销毁的时候才释放。

    相关文章

      网友评论

          本文标题:ARC环境下的内存管理

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