zoukankan      html  css  js  c++  java
  • OC中的内存管理01

    一、内存管理要遵循的原则

    1> 谁创建,谁release (看到 alloc、copy、new就应该有写release的冲动)。

    2> 谁retain,谁release (简单的来说就是要负责嘛,不能retain后不管了)。

    3> 说明下苹果在这方面做的很严谨,后面的学习会接触到ARC,Xcode会帮我们自动管理相应的内存。

    二、基本原理

    1> 每个对象的内部都封装的一个与之相关的整数,称之为引用计数器。

    2> 当使用alloc、new或者copy创建对象时,计数器被设置为1。

    3> 给对象发送一条retain消息时候,计数器要+1。(OC当中的消息机制)

    4> 给对象发送一条release消息时候,计数器要-1。

    5> 当对象的计数器变成0的时候,也就证明这个对象的内存被回收了,这个时候系统就会自动给这个对象发送一个dealloc消息,  一般会重写dealloc方法,在这里释放,一定不要直接调用dealloc方法

    6> 可以给对象发送一个retainCount消息,获得当前引用计数器的值。

    学生类的声明:

    Student.h

    1 #import <Foundation/Foundation.h>
    2 #import "Book.h"
    3 @interface Student
    4 @property Book *book;
    5 @end

    学生类的实现:

    Student.m

     1 #import "Student.h"
     2 @implementation Student 
     3 @synthesize book = _book;
     4 - (void)setBook:(Book *)book{
     5     if (book != _book) {
     6         [_book release];
     7         _book = [book retain];
     8     }
     9 }
    10 - (void)dealloc {
    11     [_book release];
    12     [super dealloc];
    13 }
    14 @end

    说明:自己管理内存泄露多发生在对象的set方法中对象换成员变量的时候(上述代码中出现在学生换书的时候,先判断是不是原来的那本书,然后对原来的书做一次release

    ,对现有的一本书做一次retain才符合内存管理的原则)。

    三、@class 和 #import的区别

    1> #import 方式引入,会包含被引用类的所有信息,包括引用类的方法和变量,@class只是告诉编译器有这个类的存在,然而类中的成员变量和方法编译器是不知道的,等在

    实现中用到该类的时候在导入对应的头文件。

    2> 假如一个类的头文件被许多文件引用,那么这个文件一旦改动了,后面引用这个类的文件都要重新编译,会比较麻烦,效率的话可想而知,但是@class却解决了这个问题。

    3> 开发原则是所有类的声明全部放在.h中,类的实现全部放在.m中,如果用到某个类的方法和成员变量在用#import引入头文件。

    Student.h改进:

    1 #import <Foundation/Foundation.h>
    2 @class Book;
    3 @interface Student
    4 @property (retain) Book *book;
    5 @end

    Student.m改进:

     1 #import "Student.h"
     2 #import "Book.h"
     3 @implementation Student 
     4 //@synthesize会自动展开setter和getter, 隐藏了内存管理细节
     5 @synthesize book = _book;
     6 - (void)dealloc {
     7     [_book release];
     8     [super dealloc];
     9 }
    10 @end
  • 相关阅读:
    区块链学习(2)钱包
    区块链学习(1)密钥,公钥和地址
    Ubuntu下安装和开启telnet
    ubuntu下的ppa源使用
    tensorflow中手写识别笔记
    交叉熵解读
    Ubuntu下对executable (application/x-executable)文件创建快捷方式
    Numpy学习笔记(四)
    pycharm问题总结
    Numpy学习笔记(三)
  • 原文地址:https://www.cnblogs.com/nqs674/p/4780552.html
Copyright © 2011-2022 走看看