天天看点

[Object C]_[初级]_[Object C之内存管理]

在项目中,经常会程序崩溃,内存增大等问题,影响程序的性能,出现这个问题的原因就是内存泄露,创建的对象没有释放,或者是对象被多次释放。所以内存管理对于整个项目来说是非常重要的。

内存管理常用的几个方法

autorelease:把对象放到最近的内存池里,程序结束自动释放内存

release:引用计数减1,释放内存

retain:引用计数加1,对象拷贝了一份

retainCount:记录对象被引用的次数

dealloc:引用计数为0,自动调用该方法,把创建的对象进行销毁。

例子:

MyClass.h

#import <Foundation/Foundation.h>

@interface MyClass : NSObject
{
    NSString* name;
}
@property (readwrite,copy) NSString* name;

@end
           

MyClass.m

import "MyClass.h"

@implementation MyClass
@synthesize name;

-(id) init
{
    self =[super init];
    if(self)
    {
        NSLog(@"构造iCount:%ld",self.retainCount);
    }
    return self;
}
//引用计数为0时,调用该方法
-(void) dealloc
{
    NSLog(@"析构iCount:%ld",self.retainCount);
    [super dealloc];
}

@end
           

main.m

#import <Foundation/Foundation.h>
#import "MyClass.h"

int main(int argc, const char * argv[]) {
    
    NSAutoreleasePool *pool =[NSAutoreleasePool new];
    NSMutableArray* array =[[NSMutableArray alloc] init];
    
    for (int i =0; i<6; i++)
    {
        MyClass *ii =[[MyClass alloc] init];
        [ii setName:[NSString stringWithFormat:@"name%d",i+1]];
        [array addObject:ii];//ii被复制了一份,引用计数加1
        //[ii release]; //引用计数减1
        //输出是1,如果把[ii release]取消注释,输出是2.
        NSLog(@"addobject ii:%ld",[ii retainCount]);
        
    }
    //[array retain];
    //如果把[array retain];取消注释,输出是2.
     NSLog(@"array:%ld",[array retainCount]);
    [array release];//引用计数减1

    //retain
    MyClass *object =[MyClass new];
    [object setName:@"object"];
    
    //如果[object release]; temp指向的是一个无效的指针,运行报错
    //如果对[object retain],把object拷贝了一份,引用计数加1.
    MyClass *temp =[object retain];//赋值不拷贝一份,运行到[temp release]会报错
    NSLog(@"name:%@",temp.name);
    [object release];
    [temp release];
    
    //autorelease 把对象放到最近的内存池中,等方法调用完之后,自动释放内存
    MyClass* autoObject =[[MyClass new]autorelease];
    [autoObject setName:@"autoObject"];
    //没有必要手动release对象,释放内存。
    //[autoObject release];
    
    [pool drain];
    
    return 0;
}
           

运行结果:

[Object C]_[初级]_[Object C之内存管理]