您的位置:首页 > 其它

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操作
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: