一、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方法,这时创建的对象就会被注册到自动释放池中,同时其释放会延迟,等到自动释放池销毁的时候才释放。
网友评论