目录
引用计数-代码测试
- (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)));
}
行者常至,为者常成!