• Objective-C学习_内存管理学习笔记


     

    内存泄漏 : 应当废弃的对象在超出生命周期后继续存在

    内存管理 : 遵守配对原则,有alloc/new/copy/mutableCopy就要有相对应的release或autorelease

    原因 : Oc对象是在堆里面的(动态分配),堆里面的内存由我们程序员来管理 ;

     

    对象操作

    Objective –c 对应方法

    生成并持有对象

    alloc/new/copy/mutableCopy等

    持有对象

    retain 方法

    释放对象

    release方法

    废弃对象

    dealloc方法(系统自动调)

       内存管理的思考方式 (文中“自己”表示 : “对象的使用环境”或“开发人员”):

     

      1.自己生成的对象,自己持有

      2.非自己生成的对象,自己也能持有

      3.不再需要自己持有的对象时释放

      4.非自己持有的对象无法释放

     

    总结 :

    1.调用alloc或是retain方法之后,引用计数值 + 1

    2.调用release方法之后,引用计数值 - 1

    3.当引用计数值为0时,调用dealloc方法废弃对象

    4.调用retianCount,可以返回引用计数器的个数

     

    多对象内存管理步骤:(使用@property就会生成下面的set方法)

    1.在set方法中调用传进来的参数 retain方法

       -(void)setRoom(Room*)room

      {

               if(_room != room){//判断传进来的对象是否是当前的对象

                      [_room relase];//释放掉当前的对象

        _room = [room retain];//引用新的对象,赋值

      }

    2.在dealloc方法中调用release

    -(void)dealloc 

    {

      [_room release];  

      _room = nil;

      [super dealloc];

    }

     

    autorelease 使用方法:

    1. 生成并持有NSAutoreleasePool对象(@autoreleasePool)
    2. 调用已分配对象的autorelease实例方法(retainCount不会增加,只是放在释放池中而已)
    3. 废弃NSAutoreleasePool对象

     

    #import和@class的使用 :

    #import  :包含所有的信息,包含引用类的变量和方法

    @class      : 可以简单地引用一个类(仅仅告诉编译器,这个是一个类)

    @class和#import的主要区别 : #import的内容改变了就要拷贝一次。

    如何使用 :

    (1)在.H文件中使用@class

    (2)在.M文件中是用得是#import,真正使用的时候才要#import

     

    解决相互引用(retain): 一端用retain,一端用assign

     

    常见知识点或注意点: 

    (1)刚创建一个对象的计数器就为1

    (2)重写deallloc方法的时候 : [super dealloc]必须放在最后面

    (3)如果释放了对象,把所指向的地址赋值为nil,可以防止野指针操作

    (4)给空指针发送消息是不会出错的,没有什么现象

    (5)调用retain方法会返回对象本身

    (6)指针赋值并没有调用retain,需要手动调用retain

    (7)@property 生成set方法已经实现了上面的set方法和get方法,assign是默认的写法

    (8)取得一个非自己生成并自己持有的对象 : id obj=[NSMutableArray array];  持有对象 : [obj retain];(类方法里面自动调了autorelease)

    (9)如果使用非自己持有的对象,这个程序会崩溃。

    (10)__weak (只能用于ios5以上):可以避免循环引用,__修饰的变量不持有对象

    (11)占用内存较大的不要放在autoreleasepool,性能问题

    (12)重写alloc 方法的时候一定要使用self,这样子类也可以创建相对应的对象

    (13)instancetype,比id更加智能,可以在编译的时候就可以发现问题

    (14)如果直接使用   __weak UIView * view = [[UIView alloc]init];会发出警告 : Assigning retained object to weak variable……

    (15)弱应用优点 : 在持有某对象的弱引用的时,若该对象被废弃,则弱引用将会自动失效且处于nil(被赋值的状态)相对于__unsafe_unretained更安全

    (16)非OC对象是放在栈中,指针变量(4个字节)存在栈中

      (17) A.h里#import “B”,B.h里#import “A”,导致错误 (Unknown type name……)

  • 相关阅读:
    Python面向对象高级编程(__slots__、多继承、定制类)-6
    CS231n Lecture6-Training Neural Networks, part I学习笔记
    CS231n Lecture5-Convolutional Neural Networks学习笔记
    CS231n Lecture4-Introduction to Neural Networks学习笔记
    Python面向对象编程(类与实例、数据封装、继承多态、type()、isinstance())-5
    Python模块-4
    alloc和初始化的定义
    块的定义和使用
    属性的定义以及@synthesize的使用
    实例方法和类方法的定义
  • 原文地址:https://www.cnblogs.com/TangKaiFu/p/4441066.html
Copyright © 2020-2023  润新知