• 浅谈objective—C管理内存


    这段时间被导师催着论文,调试各种BUg,也是醉了,发现很大程度上,内存出错,栈溢出,各种悲剧。那么今天就和大家一起对OC的内存管理来个探微吧。Objective-C使用一个保留计数记录了我们所创建的所有对象,并且,当该计数减少为0的时候,Objective-C自动收回分配给对象一个对象的内存。例如,设创建了两个对象:

    Class *object1 = [ Class1 alloc];

    Class *object2 = [ Class2 alloc];

    现在,每个对象的保留的计数为1,我们可以通过询问每个对象其保留计数为多少并打印结果,从而验证这一点:

    printf("*object1 retain count:%i
    ",[object1 retainCount]);
    printf("*object2 retain count:%i
    ",[object2 retainCount]);
    

    我们也可显示地自行增加保留计数,如下所示:

    [object1 retain];
    [object1 retain];
    [object2 retain];
    

    当我们把retain消息传递给一个对象时,它将自己增加其保留计数,因此,在这个例子中,object1的保留计数将会从1增加2并增到3,并且object2的保留计数将从1增加2.。要减少保留计数,我们要给对象发送一条release消息:

    [object1 release];
    [object2 release];
    
    这两行代码会把object1的保留计数减少到2,并且object2的保留计数减少到1.。

    当我们发送一条release消息把一个对象保留计数减少到0的时候,objective-C将自动回收该对象。在此,我将自动对象实现dealloc方法,以便查看objective-C如何回收对象。请看实例~

    createobject.m

    #import <Foundation/Foundation.h>
    #import <stdio.h>
    @interface Class1:NSObject
    @end
    @implementation Class1
    @end
    
    
    int main(void)
    {
        Class1 *object1 = [[Class1 alloc] init];
        Class1 *object2 = [[Class1 alloc] init];
        printf("Created object1
    ");
        printf("Created object2
    ");
        printf("*object1 retain count:%i
    ",[object1 retainCount]);
        printf("*object2 retain count:%i
    ",[object2 retainCount]);
        
    <span style="white-space:pre">	</span>return 0;
    }
    

    看到的结果是:


    上述代码创建对象,并显示保留数

    下面我们来增加并显示保留数

    <span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="objc">#import <Foundation/Foundation.h>
    #import <stdio.h>
    @interface Class1:NSObject
    @end
    @implementation Class1
    @end
    
    int main(void)
    {
        Class1 *object1 = [[Class1 alloc] init];
        Class1 *object2 = [[Class1 alloc] init];
        printf("Created object1
    ");
        printf("Created object2
    ");
        printf("*object1 retain count:%i
    ",[object1 retainCount]);
        printf("*object2 retain count:%i
    ",[object2 retainCount]);
    	[object1 retain];
    	[object1 retain];
    	[object2 retain];
    	printf("After increatecount:");
    	printf("*object1 retain count:%i
    ",[object1 retainCount]);
        printf("*object2 retain count:%i
    ",[object2 retainCount]);
        
    	return 0;
    }

    运行结果:

    
    
    <img src="http://img.blog.csdn.net/20150319204010986?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhaGFvODkxNQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
    
    </pre><p>接下来,内存回收对象,当一个对象的保留数达到0时候,Objective-C从内存回收对象。我们通过如下方法来看看这如何做到:覆盖对象的dealloc方法,并且当回收对象的时候显示一条消息。</p><p>dealloc.m</p><p></p><pre name="code" class="objc">#import <Foundation/Foundation.h>
    #import <stdio.h>
    @interface Class1:NSObject
    -(void) dealloc;
    @end
    @implementation Class1
    -(void) dealloc;
    {
    	printf("Dealloing the object
    ");
    	[super dealloc];
    }
    @end
    
    int main(void)
    {
        Class1 *object1 = [[Class1 alloc] init];
        Class1 *object2 = [[Class1 alloc] init];
        printf("Created object1
    ");
        printf("Created object2
    ");
        printf("*object1 retain count:%lu
    ",[object1 retainCount]);
        printf("*object2 retain count:%lu
    ",[object2 retainCount]);
    	[object1 retain];
    	[object1 retain];
    	[object2 retain];
    	printf("After increatecount:");
    	printf("*object1 retain count:%lu
    ",[object1 retainCount]);
        printf("*object2 retain count:%lu
    ",[object2 retainCount]);
    	
    	[object1 release];
    	[object2 release];
    	
    	printf("*object1 retain count:%lu
    ",[object1 retainCount]);
        printf("*object2 retain count:%lu
    ",[object2 retainCount]);
    	
    	[object1 release];
    	[object1 release];
    	[object2 release];
    	
        
    	return 0;
    }


    上述代码创建两个Class1对象,并且分别对增加和减少了object1和object2的保留计数,最后,得将它们的保留计数设置为0,此时Objective-C回收对象,同时覆盖方法dealloc的一条消息进行确认。

    使用自动释放池  

    如果使用alloc或new来创建一个对象,我们将自己负责管理对象的内存(如果与内存有关时),但是,对于不是使用alloc或者new创建对象,我们可以让Objective-C使用一个自动释放池来管理它们。只要创建一个pool对象,然后,对象将自动地放置到该对象中。在程序末尾,我们只需要释放池就可以释放所有对象。


    当然还有创建类时候,手动的回收,存储对象自行回收,等等。写程序,某种意义上来说,就是对内存划分。今儿就想说到这了,算是抛砖引玉~





  • 相关阅读:
    Neko's loop HDU-6444(网络赛1007)
    Parameters
    SETLOCAL
    RD / RMDIR Command
    devenv 命令用法
    Cannot determine the location of the VS Common Tools folder.
    'DEVENV' is not recognized as an internal or external command,
    How to change Visual Studio default environment setting
    error signing assembly unknown error
    What is the Xcopy Command?:
  • 原文地址:https://www.cnblogs.com/jiahao89/p/5118299.html
Copyright © 2020-2023  润新知