精华内容
下载资源
问答
  • 内存管理原则

    2017-03-19 15:35:00
    1.内存管理原则 苹果官方规定的内存管理原则 谁创建谁release : 如果你通过alloc、new、copy或mutableCopy来创建一个对象,那么你必须调用release或autorelease 谁retain谁release: 只要你...

    1.内存管理原则

    • 苹果官方规定的内存管理原则

      • 谁创建谁release :

        • 如果你通过alloc、new、copy或mutableCopy来创建一个对象,那么你必须调用release或autorelease
      • 谁retain谁release:

        • 只要你调用了retain,就必须调用一次release
    • 总结一下就是

      • 有加就有减
      • 曾经让对象的计数器+1,就必须在最后让对象计数器-1

    2.多对象内存管理

    • 单个对象的内存管理, 看起来非常简单

    • 如果对多个对象进行内存管理, 并且对象之间是有联系的, 那么管理就会变得比较复杂

    • 其实, 多个对象的管理思路 跟很多游戏的房间管理差不多

    • 总的来说, 有这么几点管理规律

      • 只要还有人在用某个对象,那么这个对象就不会被回收
      • 只要你想用这个对象,就让对象的计数器+1
      • 当你不再使用这个对象时,就让对象的计数器-1

     

    3.set方法内存管理

    • (1)retain需要使用的对象
    • (2)release之前的对象
    • (3)只有传入的对象和之前的不同才需要release和retain
    - (void)setRoom:(Room *)room
    {
        // 避免过度释放
        if (room != _room)
        {
            // 对当前正在使用的房间(旧房间)做一次release
            [_room release];
    
            // 对新房间做一次retain操作
             _room = [room retain];
        }
    }

    4.dealloc方法的内存管理

    - (void)dealloc
    {
        // 当人不在了,代表不用房间了
        // 对房间做一次release操作
        [_room release];
        [super dealloc];
    }

     

    转载于:https://www.cnblogs.com/xufengyuan/p/6580706.html

    展开全文
  • Cocos2d-x 内存管理原则

    2019-09-30 01:48:51
    2.3.9 Cocos2d-x 内存管理原则 程序段必须成对执行 retain()和release()或者执行 autorelease()来声明开始和结束对象的引用;工厂方法返回前,应通过autorelease()结束对该对象的引用;对象传值时,应考虑到新旧...


    2.3.9  Cocos2d-x 内存管理原则  

        程序段必须成对执行 retain()和release()或者执行 autorelease()来声明开始和结束对象的引用;工厂方
    法返回前,应通过autorelease()结束对该对象的引用;对象传值时,应考虑到新旧对象相同的特殊情况;尽量使用release()
    而不是 autorelease()来释放对象引用,以确保性能最优;保存 CCObject 的子类对象时,应严格使用 Cocos2d-x 提供的容
    器,避免使用 STL 容器,对象必须以指针形式存入。
    如果希望自定义的类也拥有 Cocos2d-x 的内存管理功能,可以把 CCObject 作为自定义类的基类,并在实现类时严格遵守
    Cocos2d-x 的内存管理原则。

    转载于:https://www.cnblogs.com/Star9527/p/3404440.html

    展开全文
  • 03-OC内存管理原则

    2014-10-06 13:11:00
    1、原则分析 (1) 只要对象还在被使用,系统就不会回收对象占用的内存。 (2) 当你使用对象的...2、内存管理原则 (1)谁创建,谁 release  1> 如果你通过alloc 、new、或[mutable]copy来创建一个对象,...

     

    1、原则分析

    (1) 只要对象还在被使用,系统就不会回收对象占用的内存。

    (2) 当你使用对象的时候,就调用 retain 方法,使对象的计数器+1。

    (3) 当你不再使用对象的时候,就调用 release 方法,使对象的计数器-1。

    2、内存管理原则

    (1)谁创建,谁 release

      1> 如果你通过 allocnew、或[mutable]copy来创建一个对象,那么你必须调用 release autorelease

      2> 换句话说,不是你创建的,就不需要你去 release autorelease

    (2) retain,谁 release

      只要你调用了 retain,无论这个对象是如何生成的,你都要调用 release

    总结

    (1)有始有终,有加就有减

    (2)曾经让对象的计数器+1,就必须在最后让对象计数器-1

    看见alloc,就要有release的冲动!

     

    转载于:https://www.cnblogs.com/xdl745464047/p/4008142.html

    展开全文
  • 内存管理  范围: 任何继承了NSObject 的对象,对基本数据类型无效  原理: 每个对象内部都保存了一个与之相关联的整数,称为引用计数器(auto reference count)每当使用 alloc、new...

    内存管理

        范围:

    • 任何继承了NSObject 的对象,对基本数据类型无效

       原理:

    • 每个对象内部都保存了一个与之相关联的整数,称为引用计数器(auto reference count)
    • 每当使用 allocnew或者copy创建一个对象时,对象的引用计数器被设置为1
    • 给对象发送一条retain消息(即调用retain方法),可以使引用计数器值+1
    • 给对象发送一条release消息,可以使引用计数器值-1
    • 当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收,OC也会自动向对象发送一条dealloc消息。一般会重写dealloc方法,在这里释放相关资源。一定不要直接调用dealloc方法
    • 可以给对象发送retainCount消息获得当前的引用计数器值。

    内存管理原则

    1. 谁创建,谁释放(“谁污染,谁治理”)。如果你通过allocnew或者(mutable)copy来创建一个对象,那么你必须调用releaseautorelease。或句话说,不是你创建的,就不用你去释放
    2. 一般来说,除了allocnewcopy之外的方法创建的对象都被声明了autorelease(autorelease是延迟释放内存,不用你自己去手动释放,系统会知道在什么时候该去释放掉它。)
    3. retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release

    下面是测试代码:

    新建一个基于“Command Line Tool”的工程,名为“内存管理1-retain和release的简单使用”,再新建一个Student类。

    Student.h

    1. //  
    2. //  Student.h  
    3. //  内存管理1-retain和release的简单使用  
    4. //  
    5.   
    6. #import <Foundation/Foundation.h>  
    7.   
    8. @interface Student : NSObject  
    9. {  
    10.     int age;  
    11. }  
    12.   
    13. @property int age;  
    14.   
    15. @end  

    Student.m

    1. //  
    2. //  Student.m  
    3. //  内存管理1-retain和release的简单使用  
    4.   
    5. #import "Student.h"  
    6.   
    7. @implementation Student  
    8.   
    9. @synthesize age;  
    10.   
    11. //重写dealloc方法,当引用计数器(auto reference count)为零的时候调用,注意,没有在.h头文件中声明的方法都属于私有方法。  
    12. - (void)dealloc{  
    13.       
    14.     //insert your code here...  
    15.     NSLog(@"%@被销毁了",self);  
    16.       
    17.     [super dealloc];//一定要调用super的dealloc方法,而且最好放在最后面实现  
    18. }  
    19.   
    20. @end  

    main.m

    1. //  
    2. //  main.m  
    3. //  内存管理1-retain和release的简单使用  
    4. //
    5.   
    6. #import <Foundation/Foundation.h>  
    7. #import "Student.h"  
    8.   
    9. int main(int argc, const char * argv[])  
    10. {  
    11.   
    12.     @autoreleasepool {  
    13.           
    14.         Student *stu = [[Student alloc]init];//alloc一次,引用计数器为1  
    15.         //Student *stu = [[[Studnet alloc]init] autorelease]; //这样写的话系统会在适当的地方对stu的内存进行自动回收,就不用自己写release回收了  
    16.           
    17.         //z代表无符号  
    18.         NSLog(@"count:%zi", [stu retainCount]);  
    19.           
    20.         [stu retain];//引用计数器变为2  
    21.         NSLog(@"count:%zi", [stu retainCount]);  
    22.           
    23.         [stu release];//引用计数器变为1  
    24.         NSLog(@"count:%zi", [stu retainCount]);          
    25.           
    26.         [stu release];//release一次,引用计数器减1,变为0,,,然后会调用dealloc方法  
    27.           
    28.     }  
    29.     return 0;  
    30. }  

    运行结果:

    2013-08-26 10:53:14.506内存管理1-retainrelease的简单使用[754:303] count:1

    2013-08-26 10:53:14.508内存管理1-retainrelease的简单使用[754:303] count:2

    2013-08-26 10:53:14.509内存管理1-retainrelease的简单使用[754:303] count:1

    2013-08-26 10:53:14.509内存管理1-retainrelease的简单使用[754:303] <Student: 0x100109a80>被销毁了


    1.在实际开发中很少会用到new,一般创建对象咱们看到的全是[[className alloc] init]

    但是并不意味着你不会接触到new,在一些代码中还是会看到[className new],

    还有去面试的时候,也很可能被问到这个问题。

    2.那么,他们两者之间到底有什么区别呢

    我们看源码:

    1. new 
    2. id newObject = (*_alloc)((Class)self, 0); 
    3. Class metaClass = self->isa; 
    4. if (class_getVersion(metaClass) > 1) 
    5. return [newObject init]; 
    6. else 
    7. return newObject; 
    8.  
    9. //而 alloc/init 像这样: 
    10. + alloc 
    11. return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());  
    12. - init 
    13. return self; 

    通过源码中我们发现,[className new]基本等同于[[className alloc] init];

    区别只在于alloc分配内存的时候使用了zone.

    这个zone是个什么东东呢?

    它是给对象分配内存的时候,把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的代价,提升了程序处理速度;

    3.而为什么不推荐使用new?

    不知大家发现了没有:如果使用new的话,初始化方法被固定死只能调用init.

    而你想调用initXXX怎么办?没门儿!据说最初的设计是完全借鉴Smalltalk语法来的。

    传说那个时候已经有allocFromZone:这个方法,

    但是这个方法需要传个参数id myCompanion = [[TheClass allocFromZone:[self zone]] init];

    这个方法像下面这样:

    1. + allocFromZone:(void *) z 
    2. return (*_zoneAlloc)((Class)self, 0, z);  
    3.  
    4. //后来简化为下面这个: 
    5. + alloc 
    6. return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());  

    但是,出现个问题:这个方法只是给对象分配了内存,并没有初始化实例变量。

    是不是又回到new那样的处理方式:在方法内部隐式调用init方法呢?

    后来发现“显示调用总比隐式调用要好”,所以后来就把两个方法分开了。

    概括来说,new和alloc/init在功能上几乎是一致的,分配内存并完成初始化。

    差别在于,采用new的方式只能采用默认的init方法完成初始化,

    采用alloc的方式可以用其他定制的初始化方法。

    展开全文
  • 以下两种方法都有内存...内存管理原则: 1、谁创建、谁释放(谁污染,谁治理) 如果你通过了alloc、new或者copy创建了一个对象,那么你就必须调用release、autorelease方法来释放内存 那个方法创建了对象,就有哪个
  • 1.Objective-C 的内存管理原则采用的是引用计数机制 2.引用计数机制的实现方式分为自动引用计数(ARC)和非自动引用计数机制(MARC) 3.当引用计数为0时,系统自动销毁该实例对象所占用的内存,并且对该实例对象发送...
  • ios内存管理原则

    2016-09-27 09:49:31
    1. 内总管理原则(引用计数)  IOS的对象都继承于NSObject, 该对象有一个方法:retainCount ,内存引用计数。 引用计数在很多技术都用到: window下的COM组件,多线程的信号量,读写锁,思想都一样。    (一般情况...
  • Block 内存管理原则

    2016-02-24 00:33:00
    今天在写代码的时候,遇到了Block一直EXC_BAD_ACCESS的问题,之前一直觉得Block应该像int一样直接...Block内存管理的规则: 1,Block指针会在方法或函数结束后release掉,此时内存是储存在Stack里。 2,如...
  • ios 内存管理原则

    2014-03-25 09:55:35
    iOS下内存管理的基本思想就是引用计数,通过对象的引用计数来对内存对象的生命周期进行控制。具体到编程时间方面,主要有两种方式: 1:MRR(manual retain-release),人工引用计数,对象的生成、销毁、引用计数...
  • OC内存管理原则

    2016-07-25 14:39:00
    内存管理应该从对象所有权的角度思考,而不应该从引用计数的角度,去过分强调实现细节。 基本原则 你拥有任何你创建的对象。 使用 “alloc”, “new”, “copy”或者“mutableCopy” 创建的对象。 可以...
  • *切不要初始化两回,内存会溢出,而且对象锁定也会出错。 在iphone中,只要控件使用IBOutlet连接 ,则必须release它。无论它是否有@property (retain)属性。 在mac os 中,如果控件使用IBOutlet连接,而...
  • 为什么要进行内存管理。 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的...
  • 内存管理方针 用于内存管理的基本模型采用引用计数的环境之中提供的组合方法中定义在NSObject协议和标准方法的命名约定。NSObject类也定义了一个方法:dealloc,当调用一个对象时自动回收,本文描述了Cococa程序中...
  • 内存管理 原则: 1、在一段代码内,对象的引用计数增加和减少要保证平衡。 2、凡是调用了retain、alloc、copy造成引用计数增加,当不再需要使用这个对象时,要调用release或autorelease相应的减少引用计数。 ...
  • Cocoa的内存管理原则

    2016-01-16 12:07:20
    因为其他地方可能还需要使用这个成员变量,所以,这块内存什么时候才回收呢,在该对象销毁的时候才回收这块内存。 ) 如果你使用除alloc , new 或者copy以外的方法获得了一个对象,需要记得保留该对象。...
  • ARC内存管理原则总结

    千次阅读 2014-07-31 17:05:44
     基本原则:1、只要某个对象被任一strong指针指向,那么它将不会被销毁,否则立即释放,不用等runloop结束。如果对象没有被任何strong指针指向,那么就将被销毁。所有strong指针变量不需要在dea
  • cocos2d-x内存管理原则

    2014-12-09 14:52:05
    使用cocos2d-x开发游戏时内存管理原则:  1.程序段必须成对执行retain()和release()或者执行autorelease()来开始和结束对象的引用;  2.工厂方法返回前,应通过autorelease()结束该对象的引用;  3.对象...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,299
精华内容 519
关键字:

内存管理原则