JHHK

欢迎来到我的个人网站
行者常至 为者常成

自动引用计数(测试)

目录

引用计数-代码测试

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self referencCountTest1];
    
    [self referencCountTest2];
    
    [self referencCountTest3];
    
    [self referencCountTest4];

    [self referencCountTest5];
    
    [self referencCountTest6];
}

1.对相关对象做两次强引用,引用计数变为2

-(void)referencCountTest1{
    //强引用  retainCount 1
    id obj = [[NSObject alloc] init];
    NSLog(@"[xxlog]:obj=%@",obj);
    printf("retain count1-1 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));
    
    
    //强引用 retainCount 2
    id obj2 = obj;
    NSLog(@"[xxlog]:obj2=%@",obj2);
    printf("retain count1-2 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));
}

2.将相关对象放入一次自动释放池,引用计数会加1

-(void)referencCountTest2{
    //retainCount 1
    id obj = [[NSObject alloc] init];
    NSLog(@"[xxlog]:obj=%@",obj);
    printf("retain count2-1 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));
    
    //retainCount 2
    id obj2 = obj;
    NSLog(@"[xxlog]:obj2=%@",obj2);
    printf("retain count2-2 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));

    //retainCount 3
    id __autoreleasing temp = obj;
    NSLog(@"[xxlog]:temp=%@",temp);
    printf("retain count2-3 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));
    
    //retainCount 4
    id __autoreleasing temp1 = obj;
    NSLog(@"[xxlog]:temp1=%@",temp1);
    printf("retain count2-3 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));
}

3.离开变量作用域,相关变量废弃,强引用消失

-(void)referencCountTest3{
    
    id hold = nil;
    {
        //retainCount 1
        id obj = [[NSObject alloc] init];
        NSLog(@"[xxlog]:obj=%@",obj);
        printf("retain count3-1 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));
        
        //retainCount 2
        hold = obj;
        NSLog(@"[xxlog]:hold=%@",hold);
        printf("retain count3-2 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));
    }
    
    //retainCount 1
    NSLog(@"[xxlog]:hold=%@",hold);
    printf("retain count3-3 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(hold)));
}

4.离开变量作用域,相关变量废弃,强引用消失(2)

-(void)referencCountTest4{
    
    id __weak hold = nil;
 
    {
        //retainCount 1
        id obj = [[NSObject alloc] init];
        NSLog(@"[xxlog]:obj=%@",obj);
        printf("retain count4-1 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));
        
        //retainCount 1
        hold = obj;
        NSLog(@"[xxlog]:hold=%@",hold);
        printf("retain count4-2 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));
    }
    
    //retainCount 0 崩溃
    NSLog(@"[xxlog]:hold=%@",hold);
    printf("retain count4-3 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(hold)));
}

5.当__weak与autoreleasing一起时

-(void)referencCountTest5{
    
    id __weak hold = nil;
    
    {
        //retainCount 1
        id obj = [[NSObject alloc] init];
        NSLog(@"[xxlog]:obj=%@",obj);
        printf("retain count5-1 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));
        
        //retainCount 1
        hold = obj;
        NSLog(@"[xxlog]:hold=%@",hold);
        printf("retain count5-2 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));
        
        //retainCount 2
        id __autoreleasing temp = obj;
        NSLog(@"[xxlog]:temp=%@",temp);
        printf("retain count5-3 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));
        
        //retainCount 3
        id obj1 = obj;
        NSLog(@"[xxlog]:obj1=%@",obj1);
        printf("retain count5-4 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));

        
        //retainCount 4
        id __autoreleasing temp1 = obj;
        NSLog(@"[xxlog]:temp1=%@",temp1);
        printf("retain count5-5 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));
        
        //retainCount 5
        id obj2 = obj;
        NSLog(@"[xxlog]:obj2=%@",obj2);
        printf("retain count5-6 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));

        
        //retainCount 6
        id __autoreleasing temp2 = obj;
        NSLog(@"[xxlog]:temp2=%@",temp2);
        printf("retain count5-7 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));

    }
    
    //retainCount 4 注册到自动释放池后 retainCount就会始终大于0,直到池子销毁时变为0.
    NSLog(@"[xxlog]:hold=%@",hold);
    printf("retain count5-8 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(hold)));
}

6.当__weak与autoreleasing与autoreleasepool一起时

-(void)referencCountTest6{
    
    id __weak hold = nil;
    @autoreleasepool {
        {
            //retainCount 1
            id obj = [[NSObject alloc] init];
            NSLog(@"[xxlog]:obj=%@",obj);
            printf("retain count6-1 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));
            
            //retainCount 1
            hold = obj;
            NSLog(@"[xxlog]:hold=%@",hold);
            printf("retain count6-2 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));
            
            //retainCount 2
            id __autoreleasing temp = obj;
            NSLog(@"[xxlog]:temp=%@",temp);
            printf("retain count6-3 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));
            
            //retainCount 3
            id obj1 = obj;
            NSLog(@"[xxlog]:obj1=%@",obj1);
            printf("retain count6-4 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));

            
            //retainCount 4
            id __autoreleasing temp1 = obj;
            NSLog(@"[xxlog]:temp1=%@",temp1);
            printf("retain count6-5 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));
            
            //retainCount 5
            id obj2 = obj;
            NSLog(@"[xxlog]:obj2=%@",obj2);
            printf("retain count6-6 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));

            
            //retainCount 6
            id __autoreleasing temp2 = obj;
            NSLog(@"[xxlog]:temp2=%@",temp2);
            printf("retain count6-7 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));

        }
        
        //retainCount 4 注册到自动释放池后 retainCount就会始终大于0,直到池子销毁时变为0.
        NSLog(@"[xxlog]:hold=%@",hold);
        printf("retain count6-8 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(hold)));
    }
    
    //retainCount 0 注册到自动释放池后 retainCount就会始终大于0,直到池子销毁时变为0.
    NSLog(@"[xxlog]:hold=%@",hold);
    printf("retain count6-9 =%ld\n",CFGetRetainCount((__bridge CFTypeRef)(hold)));

}

行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.