1 自动垃圾回收
系统自动检测对象是否拥有其他对象,不再有引用的对象将会被自动回收。IOS并不支持自动垃圾回收,MAC OS X支持。
2 手工管理内存
NSStudent *stu = [[NSStudent alloc] init];
[stu retain]; //引用计数加1
[stu release]; //引用计数减1
[stu dealloc]; //释放
当对象的引用计数为0的时候就代表对象不再被引用,就可以回收内存,通过调用dealloc方法,回收内存。
dealloc方法继承自NSObject,默认释放对象的内存,如果当前对象内组合其他对象,就需要覆写dealloc方法,对组合的对象进行释放。
注意:当一个对象被销毁后,引用失效,对引用release或dealloc会出错。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;