ARC内存管理的基本特点

掌握了MRC的程序员,对ARC的熟悉就非常容易。下面是ARC内存管理的基本特点。

1、ARC模式新引入对象变量属性strong与weak的说明。
  strong与weak,都是用来修饰对象变量的,但不能修饰基本类型变量。
  strong的作用是类似于MRC模式中的retain,weak的作用是类似于MRC模式中的assign。
  1-1、对象变量的默认属性是strong,除非是用weak声明过。
  1-2、在ARC编译的开发中,当一个对象不再有strong类型的指针指向它的时候,它会被释放,即使还有weak型指针指向它。
  1-3、临时变量,和成员变量一样遵守语法1-1和1-2。而且在函数结束的时候会自动重置成nil。
  1-4、weak的常用场景:
    1-3-1、委托对象delegate。
    1-3-2、xib方式的IBOutlet变量。
    1-3-3、weak引用通常是用于处理循环引用的问题,如代理及block的使用中,相对会较多的使用到weak。

2、对象变量不必也不能调用retain、release、autorelease函数。

3、dealloc函数不必也不能调用[super dealloc]

4、其他(例如:桥接转换关键字__bridge、__bridge_transfer和__bridge_retained等等):略。

下面这个例子可以帮助大家很好的了解strong与weak的作用。

@interface HsPage : UIView
{
}

@property (nonatomic, strong) UIView *viewPtrA;
@property (nonatomic, strong) UIView *viewPtrB;
@property (nonatomic, weak)   UIView *viewPtrC;
@property (nonatomic, weak)   UIView *viewPtrD;
@property (nonatomic, weak)   UIView *viewPtrE;

@end

@implementation HsPage

- (void)dealloc
{
}

- (id)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        //创建视图对象V1.
        _viewPtrA = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 20)];//strong
        _viewPtrB = _viewPtrA;//strong
        _viewPtrC = _viewPtrA;//weak
        _viewPtrD = _viewPtrA;//weak
        _viewPtrE = _viewPtrA;//weak
        
        //创建视图对象V2.
        UIView *tempPtrF = [[UIView alloc] initWithFrame:CGRectMake(0, 20, 100, 20)];//strong //若要提前销毁,则手动将tempPtrF置成nil即可。否则只能等这个函数执行完之后,tempPtrF会自动置成nil。
        
        //创建视图对象V3.
        __weak UIView *tempPtrG = [[UIView alloc] initWithFrame:CGRectMake(0, 40, 100, 20)];//weak //使用weak修饰的指针所指向的视图对象V3将会立刻会被销毁。即:此句过后的tempPtrG仍是nil。
        NSLog(@"0 - - - - - -\n\ttempPtrF = %@\n\ttempPtrG = %@", tempPtrF, tempPtrG);
        
        NSLog(@"1 - - - - - -\n\t_viewPtrA = %@\n\t_viewPtrB = %@\n\t_viewPtrC = %@\n\t_viewPtrD = %@\n\t_viewPtrE = %@", _viewPtrA, _viewPtrB, _viewPtrC, _viewPtrD, _viewPtrE);
        
        _viewPtrA = nil;//此句过后的视图对象V1仍未销毁,这是因为仍有_viewPtrB强引用它。
        NSLog(@"2 - - - - - -\n\t_viewPtrA = %@\n\t_viewPtrB = %@\n\t_viewPtrC = %@\n\t_viewPtrD = %@\n\t_viewPtrE = %@", _viewPtrA, _viewPtrB, _viewPtrC, _viewPtrD, _viewPtrE);
        
        _viewPtrC = nil;//此句过后的视图对象V1仍未销毁,这是因为仍有_viewPtrB强引用它。
        NSLog(@"3 - - - - - -\n\t_viewPtrA = %@\n\t_viewPtrB = %@\n\t_viewPtrC = %@\n\t_viewPtrD = %@\n\t_viewPtrE = %@", _viewPtrA, _viewPtrB, _viewPtrC, _viewPtrD, _viewPtrE);
        
        _viewPtrB = nil;//此句过后的视图对象V1会被销毁,这是因为_viewPtrB强引用了其他对象,导致目前没有任何一个强引用它,此时所有弱引用它的指针都会被重置成nil。
        NSLog(@"4 - - - - - -\n\t_viewPtrA = %@\n\t_viewPtrB = %@\n\t_viewPtrC = %@\n\t_viewPtrD = %@\n\t_viewPtrE = %@", _viewPtrA, _viewPtrB, _viewPtrC, _viewPtrD, _viewPtrE);
    }
    
    return self;
}
 

 

@end

//执行语句HsPage *tempPage =  [[HsPage alloc] initWithFrame:CGRectZero];之后,控制台输出的日志如下图所示。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值