ARC,MRC理解
2015-09-09 20:00
429 查看
1/*
oc里面有三种 ARC MRC gc
java里面有垃圾回收机制
1. 人工引用计数-MRC(MannulReference Counting)
2. 自动引用计数-ARC(AutomaticReference Counting)
在MRC的内存管理模式下,与对变量的管理相关的方法有:retain,release和autorelease。retain和release方法操作的是引用记数,当引用记数为零时,便自动释放内存。并且可以用NSAutoreleasePool对象,对加入自动释放池(autorelease调用)的变量进行管理,当drain时回收内存。
(1) retain,该方法的作用是将内存数据的所有权附给另一指针变量,引用数加1,即retainCount+= 1;
(2) release,该方法是释放指针变量对内存数据的所有权,引用数减1,即retainCount-= 1;
(3) autorelease,该方法是将该对象内存的管理放到autoreleasepool(自动释放池)中。出了“最近的自动释放池”后autorelease会自动减1
iOS里面采用引用计数内存,具体有2种内存管理方式, ARC—自动引用计数,MRC—人工引用计数,前者Xcode会帮助管理内存,后者需要开发人员手动去控制应用计数,一块内存区域引用计数一旦变为0,系统会降其删除(标记删除)。
iOS里面的内存管理关键字有 alloc、retain、release、autorelease、copy,
其中alloc的作用开辟内存引用从0变为1,
retain的作用引用计数进行 加1 操作,
release的作用对内存引用计数立刻进行减1操作,
autorelease是对内存引用计数在未来的某个时刻进行 减1 操作,
copy的作用拷贝一个对象到新的内存区域,原来内存区域的引用计数不变,新的区域引用计数由0变为1.
引用计数只针对于堆区
字符串存在常量区
retain 立刻+1; release 立刻-1; autoreleas 未来某个时刻-1;
alloc永远只是从0加到1
*/
// Person *p = [[Person alloc]init];
// // 指针是一个变量,存在于栈区,指针指向的内容Person存在于堆区
// [p retain]; // 内存引用计数加1
//// [p release]; // 内存引用计数减1
//// [p release];
// [p autorelease];
// [p autorelease];
// NSLog(@"%lu",p.retainCount);
//
// NSString *name1 = [[NSString alloc]initWithString:@"hehe"];
// NSLog(@"%lu",name1.retainCount);
// NSString *name2 = @"hehe";
// NSLog(@"%lu",name2.retainCount);
//// 上面只创建一个字符串自动放在常量区,下面的创建多个字符串放在堆区
// NSString *name3 = [[NSString alloc]initWithFormat:@"%@%@",@"woshi",@"daren"];
// NSLog(@"%lu",name3.retainCount);
// //不是所有的对象都可以使用copy,必须是遵守了NSCopying协议的对象
// Person *p = [[Person alloc]init];
// Person *p1 = [p copy];
// NSLog(@"p = %lu,p1 = %lu",p.retainCount,p1.retainCount);
/////////////MRC管理内存有一条原则:有加1就要有减1,谁开辟谁释放,谁加1谁减1
//
// NSString *test1 = [[NSString alloc]initWithFormat:@"%@",@"gxm"];
// Person *p = [[Person alloc]init];
// p.name = test1;
// //对test进行减一
// [test1 release];
//
// NSString *test2 = [[NSString alloc]initWithFormat:@"%@",@"pangz"];
// p.name = test2;//set方法
// test2 = p.name;//get方法
// [test2 release];
// NSLog(@"%@",p.name);
//
// NSLog(@"%lu",sizeof(test1));
// NSLog(@"%lu",sizeof([Person class]));
/*
@autoreleasepool { // 自动释放池1
[test2 release];
}
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
test2; // 自动释放池2
[pool release];
*/
// Person *person1 = [[Person alloc]init];
// Person *person2 = [[Person alloc]init];
// NSLog(@"person1=%lu,person2=%lu",person1.retainCount,person2.retainCount);
//
// NSArray *array = [NSArray arrayWithObjects:person1,person2,nil];//OC里面所有的集合类会自动对里面的对象进行加1操作,当对象被移除的时候会自动减1
// NSLog(@"person1=%lu,person2=%lu",person1.retainCount,person2.retainCount);
//
// [person1 release];
// [person2 release];
// NSLog(@"person1=%lu,person2=%lu",person1.retainCount,person2.retainCount);
//
// for (Person *p in array) {
// NSLog(@"%@",p);
// }
//
//[array release]//凡是便利构造器不需要进行release操作
oc里面有三种 ARC MRC gc
java里面有垃圾回收机制
1. 人工引用计数-MRC(MannulReference Counting)
2. 自动引用计数-ARC(AutomaticReference Counting)
在MRC的内存管理模式下,与对变量的管理相关的方法有:retain,release和autorelease。retain和release方法操作的是引用记数,当引用记数为零时,便自动释放内存。并且可以用NSAutoreleasePool对象,对加入自动释放池(autorelease调用)的变量进行管理,当drain时回收内存。
(1) retain,该方法的作用是将内存数据的所有权附给另一指针变量,引用数加1,即retainCount+= 1;
(2) release,该方法是释放指针变量对内存数据的所有权,引用数减1,即retainCount-= 1;
(3) autorelease,该方法是将该对象内存的管理放到autoreleasepool(自动释放池)中。出了“最近的自动释放池”后autorelease会自动减1
iOS里面采用引用计数内存,具体有2种内存管理方式, ARC—自动引用计数,MRC—人工引用计数,前者Xcode会帮助管理内存,后者需要开发人员手动去控制应用计数,一块内存区域引用计数一旦变为0,系统会降其删除(标记删除)。
iOS里面的内存管理关键字有 alloc、retain、release、autorelease、copy,
其中alloc的作用开辟内存引用从0变为1,
retain的作用引用计数进行 加1 操作,
release的作用对内存引用计数立刻进行减1操作,
autorelease是对内存引用计数在未来的某个时刻进行 减1 操作,
copy的作用拷贝一个对象到新的内存区域,原来内存区域的引用计数不变,新的区域引用计数由0变为1.
引用计数只针对于堆区
字符串存在常量区
retain 立刻+1; release 立刻-1; autoreleas 未来某个时刻-1;
alloc永远只是从0加到1
*/
// Person *p = [[Person alloc]init];
// // 指针是一个变量,存在于栈区,指针指向的内容Person存在于堆区
// [p retain]; // 内存引用计数加1
//// [p release]; // 内存引用计数减1
//// [p release];
// [p autorelease];
// [p autorelease];
// NSLog(@"%lu",p.retainCount);
//
// NSString *name1 = [[NSString alloc]initWithString:@"hehe"];
// NSLog(@"%lu",name1.retainCount);
// NSString *name2 = @"hehe";
// NSLog(@"%lu",name2.retainCount);
//// 上面只创建一个字符串自动放在常量区,下面的创建多个字符串放在堆区
// NSString *name3 = [[NSString alloc]initWithFormat:@"%@%@",@"woshi",@"daren"];
// NSLog(@"%lu",name3.retainCount);
// //不是所有的对象都可以使用copy,必须是遵守了NSCopying协议的对象
// Person *p = [[Person alloc]init];
// Person *p1 = [p copy];
// NSLog(@"p = %lu,p1 = %lu",p.retainCount,p1.retainCount);
/////////////MRC管理内存有一条原则:有加1就要有减1,谁开辟谁释放,谁加1谁减1
//
// NSString *test1 = [[NSString alloc]initWithFormat:@"%@",@"gxm"];
// Person *p = [[Person alloc]init];
// p.name = test1;
// //对test进行减一
// [test1 release];
//
// NSString *test2 = [[NSString alloc]initWithFormat:@"%@",@"pangz"];
// p.name = test2;//set方法
// test2 = p.name;//get方法
// [test2 release];
// NSLog(@"%@",p.name);
//
// NSLog(@"%lu",sizeof(test1));
// NSLog(@"%lu",sizeof([Person class]));
/*
@autoreleasepool { // 自动释放池1
[test2 release];
}
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
test2; // 自动释放池2
[pool release];
*/
// Person *person1 = [[Person alloc]init];
// Person *person2 = [[Person alloc]init];
// NSLog(@"person1=%lu,person2=%lu",person1.retainCount,person2.retainCount);
//
// NSArray *array = [NSArray arrayWithObjects:person1,person2,nil];//OC里面所有的集合类会自动对里面的对象进行加1操作,当对象被移除的时候会自动减1
// NSLog(@"person1=%lu,person2=%lu",person1.retainCount,person2.retainCount);
//
// [person1 release];
// [person2 release];
// NSLog(@"person1=%lu,person2=%lu",person1.retainCount,person2.retainCount);
//
// for (Person *p in array) {
// NSLog(@"%@",p);
// }
//
//[array release]//凡是便利构造器不需要进行release操作
相关文章推荐
- 屌屌的Web树--保存分类
- 写一个网络图片查看器
- 神经网络
- Qt5 中使用了QQuickWidget,程序退出时容易崩溃的解决办法。
- lesson3 -Vim
- 引导页的铺设
- Java简单彩票系统(35选7)
- HDU-2732 Leapin's Lizards
- 使用分布式数据库集群做大数据分析之OneProxy
- button初始化类目
- lesson2 -basic Linux tasks
- 哈哈 一个小程序
- HDU 5024(枚举+搜索/记忆化搜索)
- poj 3087 Shuffle'm Up
- ORA-00904:“”:标识符无效
- 1001--Java 多线程 并发编程
- URL最大长度
- Git book 中文
- GPU编程中的常用几何函数、纹理映射函数、偏导数函数
- 使用PHP7还是需要谨慎(2015-09-09)