什么是ARC
Automatic Reference Counting,自动引用计数. 即ARC.
- 顾名思义:系统自动的帮助我们去计算对象的引用计数器的值,
可以说是WWDC2011和iOS5引入的最大的变革和最激动人心的变化.
ARC是新的LLVM3.0编译器的一项特性,使用ARC,可以说一举解决了广大iOS开着所憎恨的手动管理内存的麻烦.
在程序中使用ARC非常简单,只需要像往常那样编写代码.
- 只不过永远不要写retain、release、autorelease这三个关键字就好,这是ARC的最基本的原则.
当ARC开启时, 编译器会自动的在合适的地方插入retain、release、autorelase代码.
- 只不过永远不要写retain、release、autorelease这三个关键字就好,这是ARC的最基本的原则.
编译器自动为对象做引用计数. 而作为开发者,完全不需要担心编译器会做错(除非开发者自己错用了ARC).
需要特别注意的是: ARC是编译器机制. 在编译器编译代码的时候,会在适时的位置加入retain、release和autorealse代码.
. ARC机制下,对象何时被释放
- 只要没有强指针指向这个对象,这个对象就会立即回收.
强指针与弱指针.
强指针: 默认情况下,我们声明1个指针 这个指针就是1个强指针.
我们也可以使用__strong来显示的声明这是1个强指针.
Person *p1; 这是1个强指针. 指针默认情况下都是1个强指针.
- __strong Person *p2; 这也是1个强指针.使用__strong来显示的声明强指针.
弱指针: 使用__weak标识的指针就叫做弱指针.
无论是强指针还是弱指针,都是指针,都可以用来存储地址,这1点没有任何区别 。
- 都可以通过这个指针访问对象的成员.
唯一的区别就是在ARC模式下.他们用来作为回收对象的基准.
- 如果1个对象没有任何强类型的指针指向这个对象的时候,对象就会被自动释放
确认程序是否开启ARC机制.
- 默认情况下,Xcode开启ARC机制.
- ARC机制下,不允许调用retain、relase、retainCount、autorelease方法.
- 在dealloc中 不允许[super dealloc];
int main(int argc, const char * argv[])
{
@autoreleasepool
{
Person *p1 = [Person new];//p1是1个强指针.
//因为我们说过,每1个指针变量默认情况下都是1个强指针变量.
NSLog(@"------");
}//当执行到这里的时候.p1指针被回收,那么Person对象就没有任何
//强指针指向它了. 对象就在这被回收.
return 0;
}
ARC下的单个对象的内存管理.
- 当指向对象的所有的强指针被回收的时候,对象就会被立即回收.
int main(int argc, const char * argv[])
{
@autoreleasepool
{
Person *p1 = [Person new];//p1是1个强指针.
Person *p2 = p1;//p2也是个强指针.p1和p2都指向Person对象.
//因为我们说过,每1个指针变量默认情况下都是1个强指针变量.
NSLog(@"------");
}//当执行到这里的时候.p1指针被回收,p2指针也被回收.那么Person对象就没有任何
//强指针指向它了. 对象就在这被回收.
return 0;
}
- 将所有指向对象的强指针赋值为nil的时候.对象就会被立即回收.
int main(int argc, const char * argv[])
{
@autoreleasepool
{
Person *p1 = [Person new];//p1是1个强指针.
//因为我们说过,每1个指针变量默认情况下都是1个强指针变量.
p1 = nil;//当执行到这句话的时候.p1赋值为nil.
//p1指针不再执行Person对象.
//Person对象没有被任何的指针所指向,所以.Person对象在这里被释放.
NSLog(@"------");
}
return 0;
}
- .最重要的1点:不能创建对象用1个弱指针存储这个对象的指针.
- 这样的话,刚创建出来的对象,就没有任何强指针指向,创建出来就会被回收.
int main(int argc, const char * argv[])
{
@autoreleasepool
{
//创建1个对象,将这个对象的地址赋值给1个弱指针
//后果就是创建出来的这个对象没有被任何强指针指向.
//刚创建出来就会被释放.
__weak Person *p1 = [[Person alloc] init];
}
return 0;
}