Object-c内存管理简介

来源:互联网 发布:郑州电力编程招聘 编辑:程序博客网 时间:2024/06/18 04:56

1 自动垃圾回收

系统自动检测对象是否拥有其他对象,不再有引用的对象将会被自动回收。IOS并不支持自动垃圾回收,MAC OS X支持。

 

2 手工管理内存

NSStudent *stu = [[NSStudent alloc] init];[stu retain]; //引用计数加1[stu release]; //引用计数减1 [stu dealloc]; //释放

当对象的引用计数为0的时候就代表对象不再被引用,就可以回收内存,通过调用dealloc方法,回收内存。

dealloc方法继承自NSObject,默认释放对象的内存,如果当前对象内组合其他对象,就需要覆写dealloc方法,对组合的对象进行释放。

注意:当一个对象被销毁后,引用失效,对引用releasedealloc会出错。foundation框架中很多方法会使引用计数增加,比如NSMutable addObject

 

3 对象引用和自动释放池

当一个对象需要延迟释放的时候,可以将对象放入自动释放池中,写法:

[ stu autorelease ]; 

自动释放池的创建:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];[pool drain];   //释放

4  @autoreleasepool块

@autoreleasepool { …… }

@autoreleasepool定义了自动释放内存的上下文,任在上下文创建的对象都是自动释放的,由ARC操作,在块结束的时候自动销毁对象。

 

5 copy和mutalbeCopy

copy和mutalbeCopy可以创建对象的副本,通过实现<NSCopying>协议实现复制。

NSMutableArray *arr1 = [NSMutableArray arrayWithObjects:@"one",@"two",@"three",nil];NSMutableArray *arr2 ; arr2 = arr1;   //简单赋值,指向同一个对象 arr2 = [arr1 mutableCopy]; //复制

6 实现NSCopying协议

可以实现NSCopying对自己的对象复制。实现NSCopying需要重写copyWithZone方法。

@interface Student : NSObject <NSCopying> -(id) copyWithZone:(NSZone*) zone{    Student *stu = [[Student allocWithZone:zone] init];    [stu setName:name];    return stu;}

7 设值和取值复制对象

-(void) setName:(NSString*)theName{    if(name != theName) {        name = [theName copy];    }}//等于如下@property (nonatomic , copy) NSString *name;
0 0