Xcode一ARC

来源:互联网 发布:巨人网络待遇 编辑:程序博客网 时间:2024/05/19 02:23

基本简介

ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain、release、autorelease语句。你不再需要担心内存管理,因为编译器为你处理了一切
ARC 是编译器特性,而不是 iOS 运行时特性,它也不是类似于其它语言中的垃圾收集器。因此 ARC 和手动内存管理性能是一样的,有时还能更加快速,因为编译器还可以执行某些优化


基本原理
规则
ARC 的规则非常简单:只要还有一个强指针变量指向对象,对象就会保持在内存中


强指针和弱指针
默认所有实例变量和局部变量都是Strong指针
弱指针指向的对象被回收后,弱指针会自动变为nil指针,不会引发野指针错误


使用注意
不能调用release、retain、autorelease、retainCount
可以重写dealloc,但是不能调用[super dealloc]
@property : 想长期拥有某个对象,应该用strong,其他对象用weak
其他基本数据类型依然用assign
两端互相引用时,一端用strong、一端用weak


ARC的判断准则:只要没有强指针指向对象,就会释放对象
 
 1.ARC特点
 1> 不允许调用release、retain、retainCount
 2> 允许重写dealloc,但是不允许调用[super dealloc]
 3> @property的参数
  * strong :成员变量是强指针(适用于OC对象类型)
  * weak :成员变量是弱指针(适用于OC对象类型)
  * assign : 适用于非OC对象类型
 4> 以前的retain改为用strong
 
 指针分2种:
 1> 强指针:默认情况下,所有的指针都是强指针 __strong
 2> 弱指针:__weak


看下面的例子
----------------------------------------------------------------------------------
int main()
{
    Dog *d = [[Dog alloc] init];         //指针d指向一个Dog对象
    
    Person *p = [[Person alloc] init];   //指针P指向一个Person对象;  
    p.dog = d;                           //人的_dag指向 d  
    
    d = nil;                             //d指向空
    
    NSLog(@"%@", p.dog);                  //默认输出的是 类名和地址, 
    
    return 0;
}




运行结果是:
[4208:303] <Dog: 0x100203600>            //当d指向空时, d并没有马上被释放, 因为人得_car还在指向dog 说以还能打印
[4208:303] Person is dealloc             //程序运行结束, p被销毁, Pesson被释放, _car随着也被销毁, 
[4208:303] Dog is dealloc                //dog被释放  


void test()
{
    
    //__weak Person *p = [[Person alloc] init];  // 错误写法(没有意义的写法)创建即被销毁


    Person *p = [[Person alloc] init];           //创建对象
    
    NSLog(@"%@", p);                             //输出类名和地址
    
    NSLog(@"------------");
}


运行结果是:
[4265:303] <Person: 0x100106c80>
[4265:303] ------------
[4265:303] Person is dealloc




#import "Person.h"


@implementation Person


- (void)dealloc
{
    NSLog(@"Person is dealloc");
    
    // [super dealloc];
}


@end


#import "Dog.h"


@implementation Dog
- (void)dealloc
{
    NSLog(@"Dog is dealloc");
}
@end


当两端循环引用的时候,解决方案:
 1> ARC
 1端用strong,另1端用weak
 
 2> 非ARC
 1端用retain,另1端用assign
看下面的例子
----------------------------------------------------------------------------------------------------
int main()
{
    Person *p = [[Person alloc] init];      //创建person对象
  
    Dog *d = [[Dog alloc] init];            //创建dog对象


    p.dog = d;                              //_dog指向 d   这是个弱指针!


    d.person = p;                           //_person指向 p


    return 0;
}


运行结果:
[4496:303] Person--dealloc
[4496:303] Dog--dealloc


#import <Foundation/Foundation.h>


@class Dog;


@interface Person : NSObject


@property (nonatomic, strong) Dog *dog;


@end
#import "Person.h"


@implementation Person


- (void)dealloc
{
    NSLog(@"Person--dealloc");
}


@end






#import <Foundation/Foundation.h>


@class Person;


@interface Dog : NSObject


@property (nonatomic, weak) Person *person;


@end




#import "Dog.h"


@implementation Dog
- (void)dealloc
{
    NSLog(@"Dog--dealloc");
}
@end


当两端循环引用的时候,解决方案:
 1> ARC
 1端用strong,另1端用weak
 
 2> 非ARC

 1端用retain,另1端用assign---------------------- 

0 0
原创粉丝点击