Object-c内存管理简介

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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值