zoukankan      html  css  js  c++  java
  • Objective-c内存管理模块

    Objective-c可以全自动的实现程序的内存管理,主要是依赖于objective-c中引用计数的管理机制

    首先:

    内存管理的准则是:如果对一个对象使用了A类. alloc,[mutable]copy[withZone],retaion那么你必须使用相应的B类.release 或者 autorelease

    解释:即每次程序中使用了A类的关键字,就需要对应使用B类的关键字释放对象内存。

    1.数组的内存管理

    一个对象声明,该对象的retainCount = 1;当将该对象添加到一个可变数组中的时候,对应的对象的retainCount会增加1。为什么呢?原因是当对象添加到数组中,该数组的该元素就会获得这个对象的所有权。所以该对象的引用计数就会增加一。当数组被release调时候,遍历数组中的每一个元素,将每一个元素都release一次,这样保证了对象被释放干净。

    NSMutableArray *dogList= [[NSMutableArray alloc] init]; //dogList -->retainCount = 1
    
    Dog *dog1 = [[Dog alloc] init]; //dog1  --retainCount = 1
    //将dog1添加到dogList中
    [dogList addObject:dog1];  //dog1  --retainCount = 2
    [dogList addObject:dog1];  //dog1  --retainCount = 3
    
    [dog1 release];  //--->retainCount 2 减一
    
    [dogList release]; //释放dogList本身,及每一个其中的元素都有被release

    扩展:关键字@autoreleasepool一个自动释放池,其工作原理类似于一个数组,当你讲对象以方法autorelease时[dog1 autorelease],编译器会自动将该对象添加到一个数组中,再release该对象,等程序结束后,就会自动release数组内的所有对象。

    2.字符串的内存管理

    字符串对象内存管理从引用计数上是很难把握的。

    当以:如下的代码,你会惊奇的发现:retainCount = -1; 这又是为什么呢?

     1 NSString *str1 = [[NSString alloc] initWithString:@"hello world"];
     2 NSLog(@"retainCount1 = %li",str1.retainCount);  //retainCount -1
     3 [str1 release];
     4         
     5         
     6 NSString *str2 = [NSString stringWithString:str1];
     7 NSLog(@"retainCount2 = %li",str2.retainCount); //retainCount -1
     8         
     9 NSString *str3 = [[NSString alloc] initWithString:str2];  //retainCoutn -1
    10 str3 release];

       NSString *str7 = [[NSString alloc] init];

        NSLog(@"str7 retainCount = %li",str7.retainCount);

        NSLog(@"str7 = %p",str7);   //打印地址,你会发现0x7fff75d4cd00  这是在栈区的  tm曾经都说对象不创建在栈内存区

       NSMutableString *mulStr1 = [[NSMutableString alloc] initWithString:str5];

        NSLog(@"mulStr1 retainCount = %li",mulStr1.retainCount);  //retainCount = 1

        NSLog(@"mulstr1 = %p",mulStr1);    

        NSMutableString *mulStr2 = [mulStr1 retain];

        NSLog(@"mulStr2 retainCount = %li",mulStr2.retainCount);  //retainCount = 2

        NSLog(@"mulstr2 = %p",mulStr2);

    好吧:

    先给出结论:

    如果字符串被创建在栈区和数据段中,retainCount的值就是-1,而可变字符串被创建在堆内存中的时候,其retainCount1,并且可以retain方法,retainCount值增加一

    虽然字符串对象的引用计数不好把握,但是直接参考管理法则,就可以行之有效的处理。

     

    3.

  • 相关阅读:
    01-面向对象
    12-期末作业
    11-Linux-vim /bash
    组播地址
    rip
    华为hcnp r&s考试一共有三门,R&S-IERS,R&S-IENP,R&S-IEEP

    spring注解开发
    yml和properties的加载顺序和区别
    @ImportResource
  • 原文地址:https://www.cnblogs.com/BeyondAverage0908/p/4587005.html
Copyright © 2011-2022 走看看