内存管理

1.管理内存有3种方式

    //:垃圾回收,java常见的管理内存的方法,系统来检测对象是否被使用,是否被释放

    //:MRC手动管理引用计数,ios管理内存的方式,程序员通过手动的方式来管理对象是否被释放,

    //:ARC自动管理引用计数,基于MRC,系统自动的管理内存,以后我们还是先使用MRC,培养管理内存的习惯

2.对象被创建出来之后,它的引用计数retainCount就变成1

    Boy *boy=[[Boy alloc] init];

    NSLog(@"%ld",boy.retainCount);

3.retain对对象的引用计数进行+1

    [boy retain];

    [boy retain];

    NSLog(@"%ld",boy.retainCount);

打印结果:2015-07-27 17:52:24.934 内存管理练习[1705:303] 1

       2015-07-27 17:52:24.936 内存管理练习[1705:303] 3

4.release对对象的引用计数-1

    [boy release];

    [boy release];

    [boy release];

在最后一个[boy release]调用dealloc

//当对象的引用计数 1->0 的时候,会自动调用dealloc方法,dealloc才是对对象释放的方法

 //当对象的调用release的时候,他的引用计数是1,这个对象就不再对他进行-1操作,而是直接调用dealloc,所以我们再访问对象的引用计数还是1

//如果多次对对象进行释放,会造成过度释放,过度释放也是最常见的内存问题

5.

    NSArray *arr=@[@"1",@"2",@"3",@"4"];

    NSLog(@"%ld",arr.retainCount);

    

    NSString *str=@"11111";

    NSLog(@"%ld",str.retainCount);

    

    NSMutableString *str2=[NSMutableString stringWithString:@"11111"];

    NSLog(@"%ld",str2.retainCount);

    

    NSDictionary *dic=@{@"1":@"2",@"3":@"4"};

    NSLog(@"%ld",dic.retainCount);

    

 //NSString 的对象在全局静态区,他的引用计数是-1,代表正整数的最大值,其他的对象都在堆区

2015-07-27 19:12:44.254 内存管理练习[1920:303] 1

2015-07-27 19:12:44.256 内存管理练习[1920:303] -1

2015-07-27 19:12:44.256 内存管理练习[1920:303] 1

2015-07-27 19:12:44.256 内存管理练习[1920:303] 1

6.release马上会把对象的引用计数-1,但是autorelease会延迟对对象的计数-1

    Boy *boy=[[Boy alloc] init];

    [boy retain];

    [boy retain];

    NSLog(@"%ld",boy.retainCount);

    

    [boy release];

    NSLog(@"%ld",boy.retainCount);

    

    [boy autorelease];

    NSLog(@"%ld",boy.retainCount);

7.自动释放池:只要对象用autorelease释放,会把对象放到系统的自动释放池中,等出了池子的范围,对象引用计数自动-1,这个相当于java的垃圾回收,对象释放由系统来管理

    

    Boy *boy=[[Boy alloc] init];

    [boy retain];

    @autoreleasepool {

        [boy autorelease];

        NSLog(@"%ld",boy.retainCount);

    }

    NSLog(@"%ld",boy.retainCount);

2015-07-27 19:26:05.030 内存管理练习[1977:303] 2

2015-07-27 19:26:05.031 内存管理练习[1977:303] 1

 8.1内存管理的原则:加多少,对应减多少,加减做到平衡

 8.2对象的所有权:拥有所有权的对象可以对他进行release

    Boy *b=[Boy boy];  //boy是一个便利构造器

    [b retain];

    NSLog(@"%ld",b.retainCount);

    [b release];

    NSLog(@"%ld",b.retainCount);

 8.3对象如果是我们进行alloc或者retain之后我们就获取了对象的所有权,就可以对对象进行release操作

 8.4便利构造器:便利构造器在返回对象的时候会加上一个autorelease,所以利用便利构造器创建对象不需要对内存进行管理


9.自定义--便利构造器(便利构造器不用release)

    NSArray *arr1=[[NSArray alloc] initWithObjects:@"1",@"2", nil];

    NSArray *arr2=[NSArray arrayWithObjects:@"1",@"2", nil];

    [arr1 release];

10.instancetype

id是泛型指针,可以用在任何方法中,但是instancetype代表实例类型,用在自定义初始化方法,便利构造器作为返回值类型使用,标识方法会返回一个对象回去

11.

 NSArray *arr=@[@"1",@"2",@"3",@"4"];

    NSLog(@"%ld",arr.retainCount);

    NSArray *arrNew=[NSArray arrayWithArray:arr];

    NSLog(@"%@",arrNew);

    NSLog(@"%ld",arrNew.retainCount);


12.NSArray->NSMutableArray(不可变->可变)

    NSArray *arr=@[@"1",@"2",@"3",@"4"];

    //方法1

    NSMutableArray *arr1=[NSMutableArray arrayWithArray:arr];

    //方法2:mutablecopy(不可变数组,字典可以通过mutableCopy转变成可变的数组,字典)

    NSMutableArray *arr2=[arr mutableCopy];

    [arr1 addObject:@"5"];

    [arr2 addObject:@"5"];

    //字典:mutableCopy

    NSDictionary *dic=@{@"1":@"2",@"3":@"4"};

    NSMutableDictionary *muDic=[dic mutableCopy];

    [muDic setObject:@"5" forKey:@"6"];

    NSLog(@"%@",muDic);

13.copy的使用

在Boy.h里签订NSCopying协议

在Boy.m里实现copyWithZone的方法

- (id)copyWithZone:(NSZone *)zone

{

    Boy *b=[Boy allocWithZone:zone];

    b.hobby=_hobby;

    b.name=_name;

    return b;

}

main.m:

//系统的类要实现copy的功能,必须先签订NSCopying协议,然后实现对应的方法initWithZone,之后就可以使用copy的功能,mutableCopy出来的对象是可变的,copy出来的对象是不可变的

  //copy:还可以改变引用计数,但是它改变的是新对象的引用计数,而原先对象的计数不变

    

    Boy *boy=[Boy BoyWithName:@"孙祥" hobby:@""];

    Boy *newBoy=[boy copy];

    NSLog(@"%@",newBoy.name);

    NSLog(@"%@",newBoy.hobby);

    

    NSLog(@"%ld",boy.retainCount);

    NSLog(@"%ld",newBoy.retainCount);

14..//当对象放入到容器Array或字典中,对象会被容器进行一次持有,就是retain一次,他的引用计数会+1,主要是为了防止空指针的问题.等对象从容器中移除掉之后,引用计数会相应的-1

    Boy *boy1=[[Boy alloc] init];

    [boy1 retain];

    [boy1 retain];

    NSLog(@"%ld",boy1.retainCount);

    NSMutableArray *arr=[NSMutableArray arrayWithObjects:boy1, nil];

    NSLog(@"%ld",[arr[0] retainCount]);

    [arr removeObjectAtIndex:0];

    NSLog(@"%ld",boy1.retainCount);

2015-07-27 20:41:30.406 内存管理练习[2269:303] 3

2015-07-27 20:41:30.408 内存管理练习[2269:303] 4

2015-07-27 20:41:30.408 内存管理练习[2269:303] 3




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值