zoukankan      html  css  js  c++  java
  • 黑马程序员-内存管理之引用计数器

    一.引用计数器

      每种语言都有自己的内存管理机制,当然OC也不例外。当一个对象创建的时候,系统在堆中给这个对象分配了一块存储区域,这个对象被栈中的对象指针所指向,当没有任何指针指向这个对象的时候,系统怎么释放这块对象内存呢?OC中是用引用计数器来实现的。每一个对象拥有一个引用计数器(占四个字节),当对象被创建时,自带的引用计数器的值就为1了。给对象发送retain消息时,对象的引用计数器就做+1操作,表示有指针拥有这个对象,发送release消息时引用计数器做-1操作,表示某个指针不在拥有这个对象。当对象的引用计数器为0的时候,表示没有任何指针拥有这个对象,系统就会自动调用dealloc方法,销毁该对象。总体来说和c语言中的管理机制差不了多少,无非是多了一些方法调用。

      下面用代码演示一下,创建一个Person类,并对其操作。

    1 #import <Foundation/Foundation.h>
    2 
    3 @interface Person : NSObject
    4 
    5 @property int age;
    6 
    7 @end
     1 #import "Person.h"
     2 
     3 @implementation Person
     4 
     5 // 重写dealloc方法,当一个Person对象被回收的时候,就会自动调用这个方法
     6 - (void)dealloc
     7 {
     8     NSLog(@"Person对象被回收");
     9     
    10     // super的dealloc一定要调用,而且放在最后面
    11     [super dealloc];
    12 }
    13 
    14 @end
    #import <Foundation/Foundation.h>
    #import "Person.h"
    
    int main()
    {
       // 对象创建的时候,引用计数器为1
        Person *p = [[Person alloc] init];
       // 打印计数器
      NSLog(@"--- %ld", [p retainCount]);
    
        // 调用了retain方法,计数器变成了2 
        Person *p2 = [p retain];
         NSLog(@"--- %ld", [p2 retainCount]);
    
        // 调用了release方法,计数器变成了1 
        [p2 release];
    
         // 调用了release方法,计数器变成了0,此时系统调用dealloc方法,  释放这块内存
        [p release];
    
        return 0;

    注意:retain方法返回的是对象本身,因为它这个方法本身就是复制对象,如上述代码中的 Person *p2 = [p retain] 就是在栈中分配了一个内容为Person对象地址的指针,也就是指向了Person对象,此时Person对象的引用计数器必须+1,来标记有否个指针在拥有我。

    二.野指针,空指针和僵尸对象。

    1> 僵尸对象 :所占用内存已经被回收的对象,僵尸对象不能再使用

    2>  野指针:指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS)

    3> 空指针:没有指向任何东西的指针(存储的东西是nil、NULL、0),给空指针发送消息不会报错

    某些场合会引起僵尸对象和野指针的存在,要理解他们的概念。

  • 相关阅读:
    OSCP Learning Notes Buffer Overflows(3)
    OSCP Learning Notes Buffer Overflows(5)
    OSCP Learning Notes Exploit(3)
    OSCP Learning Notes Exploit(4)
    OSCP Learning Notes Exploit(1)
    OSCP Learning Notes Netcat
    OSCP Learning Notes Buffer Overflows(4)
    OSCP Learning Notes Buffer Overflows(1)
    OSCP Learning Notes Exploit(2)
    C++格式化输出 Learner
  • 原文地址:https://www.cnblogs.com/pangjiayang/p/4005180.html
Copyright © 2011-2022 走看看