//只有对象才会涉及到引用计数的问题,基本数据类型不涉及
//基本类型声明的属性,成员变量,全局变量等不需要我们手动管理
// 因为他们存放在栈区,由系统管理(静态的)
//类的对象(指针)需要我们手动管理内存,因为他们存放在堆区
//由程序员手动管理(动态的)
//实例方法:
//strong,weak
//strong--->强引用标志
//weak----->弱引用标志
//1,当属性用strong声明的时候,引用计数加一
//2,当属性用weak声明的时候,引用计数不变(不加一)
-(void)setChuizi:(Weapon*)mchuizi{
// chuizi=mchuizi;
//MRC下strong的set方法—————get方法不变-------------
//retain和copy也是这个方法,面试题。。。。。。。。。。。。。。。。。
if (chuizi!=mchuizi) {
[chuizi release];
chuizi=[mchuizi retain];
}
}
// ClassA*objA=[[ClassA alloc]init];
// ClassB*objB=[[ClassB alloc]init];
//
// NSLog(@"%lu",(unsigned long)[objA.clsb retainCount]);
// NSLog(@"%lu",(unsigned long)[objB.clsa retainCount]);
// //将两个对象中的属性赋值,怎么做?
// objA.clsb=objB;
// objB.clsa=objA;
// //重复引用不能够通过编译
//
// NSLog(@"%lu",(unsigned long)[objA.clsb retainCount]);
// NSLog(@"%lu",(unsigned long)[objB.clsa retainCount]);
//
// [objA.clsb release];
// [objB.clsa release];
// NSLog(@"%lu",(unsigned long)[objA.clsb retainCount]);
// NSLog(@"%lu",(unsigned long)[objB.clsa retainCount]);
//
//
// //正常开发时没有直接使用retain、release,引入ARC也是这个原因
// //避免我们手动改变引用计数
// [objA.clsb release];
[objB.clsa release];
// NSLog(@"%lu",(unsigned long)[objA.clsb retainCount]);
// NSLog(@"%lu",(unsigned long)[objB.clsa retainCount]);
//ARC(自动引用计数(自动管理内存)),MRC(手动引用计数)
// alloc表示申请内存。
// 程序中有17836个对象,但是只有一个用到了最后
// 用ARC就会越来越慢,越来越卡
// alloc申请内存
// dealloc释放内存
// retain表示引用计数器+1
// release表示引用计数器-1
//引用计数
// oc规定,当某个对象的引用计数器为0时,这个对象会被释放,
// (自动调用这个【对象的类】的dealloc方法);
// 假设:有一个对象,这个对象不能被任何外部方式访问到,也不能被
// 任何方式实例化对象,更不能被调用
// 答:这个对象不存在(这个对象已经被释放了/这个对象的)
// 引用计数为0
//内存中常见的三种情况:-------------------------------
//提前释放:一帮人用火堆烤肉,倒数第二个吃完的人把火熄灭了
// 最后一人用不了了。
//重复引用:不要反复导入头文件,会造成对象无法释放,
//重复释放(多次释放):已经熄灭的火堆又用水去浇。
//程序员在使用、管理内存时的黄金法则:
//谁申请,谁释放。
// 在oc中彻底让引用计数归零:1释放内存,2释放指向
// HERO*hero=[[HERO alloc]init];
// [hero retain];
// [hero release];
// [hero release];
// hero=nil;
// NSInteger referenceNumber=[hero retainCount];
//
// NSLog(@"%lu",referenceNumber);
// Weapon*chui=[[Weapon alloc]init];
// HERO *hero=[[HERO alloc]init];
//
// hero.chuizi=chui;
// NSInteger num=[chui retainCount];
// NSLog(@"%li",(long)num);
//
// //chui对象,引用计数为
//NSString唯一一个不受OC引用计数限制的类型
//NSString不光不遵守引用计数限制,还经常性的不稳定。
// NSString*str=[[NSString alloc]initWithFormat:@"ha"];
//
// NSLog(@"%lu",[str retainCount]);
// [str retain];
// NSLog(@"%lu",[str retainCount]);
//1在oc中内存存储本质是通过引用计数确定一个对象是否存储
//2强弱引用必须要知道————————————————
-(void)setAddress:(NSString *)address{
if (_address!=address) {
[_address release];
//copy-->不管传进来的是可变还是不可变,copy之后的镜像都不可变
//mutablecopy-->不管传进来的是可变还是不可变,mutablecopy之后的镜像都可变。
_address=[address copy];
}
}
ARC的判断标准;只要没有強指针指向这个对象就释放该对象。(程序执行最后)