观察arc效果的一段测试代码

ARC简化了手工维护资源的麻烦,熟练使用ARC也需要遵守一些规则。

以下是对__strong引用修饰符的一段测试代码

#import <Foundation/Foundation.h>

@interface ClassA: NSObject @end

@implementation ClassA
-(id) init
{
    if (self = [super init])
    {
        NSLog(@"init %@", self);
    }
    return self;
}

-(void) dealloc
{
    NSLog(@"dealloc %@", self);
//不再调用基类的dealloc,这也是个规则
}
@end

int main(int argc, const char * argv[])
{
    NSLog(@"begin");
    @autoreleasepool {
        ClassA *obj0, *obj1, *obj2;
        obj0 = [ClassA new];
        NSLog(@"1 obj0=%@ obj1=%@ obj2=%@", obj0, obj1, obj2);
        @autoreleasepool {
            obj1 = [ClassA new];
            NSLog(@"2 obj0=%@ obj1=%@ obj2=%@", obj0, obj1, obj2);
            obj2 = nil;
            NSLog(@"3 obj0=%@ obj1=%@ obj2=%@", obj0, obj1, obj2);
            obj2 = obj0;
            NSLog(@"4 obj0=%@ obj1=%@ obj2=%@", obj0, obj1, obj2);
            obj0 = nil;
            NSLog(@"5 obj0=%@ obj1=%@ obj2=%@", obj0, obj1, obj2);
            obj1 = obj0;
            NSLog(@"6 obj0=%@ obj1=%@ obj2=%@", obj0, obj1, obj2);
            obj0 = obj2;
            NSLog(@"7 obj0=%@ obj1=%@ obj2=%@", obj0, obj1, obj2);
        }
        obj2 = nil;
        NSLog(@"8 obj0=%@ obj1=%@ obj2=%@", obj0, obj1, obj2);
    }
    NSLog(@"end");
    
    return 0;
}

mac os下输出结果

2015-02-10 16:33:37.927 cpro[505:12653] begin
2015-02-10 16:33:37.929 cpro[505:12653] init <ClassA: 0x1003003a0>
2015-02-10 16:33:37.929 cpro[505:12653] 1 obj0=<ClassA: 0x1003003a0> obj1=(null) obj2=(null)
2015-02-10 16:33:37.929 cpro[505:12653] init <ClassA: 0x1001003e0>
2015-02-10 16:33:37.929 cpro[505:12653] 2 obj0=<ClassA: 0x1003003a0> obj1=<ClassA: 0x1001003e0> obj2=(null)
2015-02-10 16:33:37.929 cpro[505:12653] 3 obj0=<ClassA: 0x1003003a0> obj1=<ClassA: 0x1001003e0> obj2=(null)
2015-02-10 16:33:37.929 cpro[505:12653] 4 obj0=<ClassA: 0x1003003a0> obj1=<ClassA: 0x1001003e0> obj2=<ClassA: 0x1003003a0>
2015-02-10 16:33:37.929 cpro[505:12653] 5 obj0=(null) obj1=<ClassA: 0x1001003e0> obj2=<ClassA: 0x1003003a0>
2015-02-10 16:33:37.930 cpro[505:12653] dealloc <ClassA: 0x1001003e0>
2015-02-10 16:33:37.930 cpro[505:12653] 6 obj0=(null) obj1=(null) obj2=<ClassA: 0x1003003a0>
2015-02-10 16:33:37.930 cpro[505:12653] 7 obj0=<ClassA: 0x1003003a0> obj1=(null) obj2=<ClassA: 0x1003003a0>
2015-02-10 16:33:37.930 cpro[505:12653] 8 obj0=<ClassA: 0x1003003a0> obj1=(null) obj2=(null)
2015-02-10 16:33:38.046 cpro[505:12653] dealloc <ClassA: 0x1003003a0>
2015-02-10 16:33:38.047 cpro[505:12653] end

无论怎样,创建和释放的次数是对称的。

可以看到,局部变量被初始化为nil;把对象设置为nil,会提前释放内存。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值