iOS开发关于内存管理(OC阶段)

作者: 西西哈哈 | 来源:发表于2016-04-01 20:43 被阅读242次

    内存管理

    我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象是存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上)。如果一个对象创建并使用后没有得到及时释放那么就会占用大量内存。其他高级语言如C#、Java都是通过垃圾回收来(GC)解决这个问题的,但在OjbC中并没有类似的垃圾回收机制,因此它的内存管理就需要由开发人员手动维护。今天简单介绍ObjC中常用的内存管理.

    内存管理原理

    当我们实例化一个对象之后通常会有一个变量来引用这个对象(变量中存储对象地址),当这个引用变量不再使用之后(也就是不再引用这个对象)此时GC就会自动回收这个对象,简单的说就是:当一个对象没有任何变量引用的时候就会被回收。

    内存管理 : 数组, 字典, 集合

    首先定义一个运动员的类: Player
    在Player.h中定义属性并初始化:
    #import <Foundation/Foundation.h>

        @interface Player : NSObject
    
        @property(nonatomic, copy)NSString *name;
        @property(nonatomic, copy)NSString *nickName;
        @property(nonatomic, assign)NSInteger age;
    
         //初始化:
        - (instancetype)initWithName:(NSString *)name
                    NickName:(NSString *)nickName
                         Age:(NSInteger)age;
        //便利构造器:
        + (instancetype)playerWithName:(NSString *)name
                      NickName:(NSString *)nickName
                           Age:(NSInteger)age;
        
        @end
    

    在Player.m中实现

     @implementation Player
      - (void)dealloc
    {
    [_name release];
    [_nickName release];
    [super dealloc];
    
    }
    
    - (instancetype)initWithName:(NSString *)name NickName:                   
    NSString *)nickName Age:(NSInteger)age
    {
      self = [super init];
     if (self) {
        _name = name;
         _nickName = nickName;
        _age = age;
     }
     return self;
    }
    
      + (instancetype)playerWithName:(NSString *)name         
       NickName:(NSString *)nickName Age:(NSInteger)age
    {
        return [[[Player alloc] initWithName:name 
       NickName:nickName Age:age] autorelease];
    }
    @end
    

    //定义数组

       NSMutableArray *array = [[NSMutableArray alloc] init];
       Player *p1 = [Player playerWithName:@"李晓旭" 
       NickName:@"篮板王" Age:25];
      //把对象添加进数组:
      [array addObject:p1];
     //释放
     [array release];
     NSLog(@"%ld", p1.retainCount);
    

    //定义字典:

      NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];
    Player *p2 = [Player playerWithName:@"郭艾伦" NickName:@"国内第一后卫" Age:20];
    
    //将对象设置为字典的value
    [dic setObject:p2 forKey:@"篮球运动员"];
    //释放
    [dic release]; 
    NSLog(@"%ld", p2.retainCount);
    

    //定义集合:

    NSMutableSet *set = [[NSMutableSet alloc] init];
    Player *p3 =[Player playerWithName:@"马布里" NickName:@"最好外援" Age:35];
    //将对象添加到集合里:
    [set addObject:p3];
    [set addObject:p3];
    [set addObject:p3]; //集合里的元素不能重复   引用计数不再 +1
    //释放:
    [set release];
    NSLog(@"%ld", p3.retainCount);
    #注意#//1.集合类型添加某个对象时,该对象引用计数会 +1
         //2.移除某个对象时,引用计数会 -1
         //3.集合对象释放之前会向所有对形象发送release消息
    

    自动释放池(简单介绍)

    一、什么是自动释放池

    (1)Autorelease pool
      自动释放池(Autorelease pool)是OC的一种内存自动回收机制,可以将一些临时变量通过自动释放池来回收统一释放
      自动释放池本身销毁的时候,池子里面所有的对象都会做一次release操作
     
    (2)如何创建一个自动释放池
    @autoreleasepool
    {
    }
    (3)自动释放池如何释放对象内存
     黄金法则:如果对一个对象使用了alloc,[mutable]copy,retain,那么必须使用相应的release或者autorelease.

    例如:(以上面的Player类为例)
    @autoreleasepool {
        Player *p = [Player playerWithName:@"易建联" 
      NickName:@"国内最好中锋" Age:30];
        //用便利构造器创建出来的对象已经添加过autorelease,不需要
         再手动添加release,否则会过度释放
        NSLog(@"%@--%@--%ld", p.name, p.nickName, p.age);
      #注意#//        [p release];  //在自动释放池里不需要加release,否则将会过度释放,如没有自动释放池再加上
      Player * p2 = [[[Player alloc]initWithName:@"朱芳雨"  
       NickName:@"三分王" Age:33] autorelease];
        NSLog(@"%@--%@--%ld",p2.name, p2.nickName, p2.age
       );
       }
    

    相关文章

      网友评论

        本文标题:iOS开发关于内存管理(OC阶段)

        本文链接:https://www.haomeiwen.com/subject/lgyylttx.html