了解ARC
ARC是iOS 5推出的新功能,全称叫 ARC(Automatic Reference Counting)。简单地说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了。
---哪些对象受ARC管理
*OC对象指针
*block指针
*使用_attribute(NSObject)定义的typedef
---哪些对象不受ARC管理
*值类型
*使用其他方式分配的堆对象
*引用计数管理
1)新创建(使用alloc,new,copy)一个引用类型对象,引用计数+1
2)对象引用计数增加+1-----retain操作
将对象引用赋值给其他变量或常量时
将对象引用赋值给其他的属性或者实例变量
将对象传递给函数参数或者返回值
将对象加入集合里面
3)对象引用计数减-1
将局部变量或全局变量赋值为nil或者其他值
将属性赋值为Nil或者其他值
实例属性所在的对象被释放
参数或局部变量离开函数
将对象从集合中删除
4)引用计数为0时,内存自动被释放
retain, release, autorelease, dealloc由编译器自动插入,不能在代码中调用
dealloc虽然可以被重载,但是不能调用[super dealloc]
void arcDemo(){
BLNPoint *p1 = [[BLNPoint alloc]init];
BLNRectangle *rect = [[BLNRectangle alloc]init];
// --------------- 引用计数 retain +1操作
BLNPoint *p2 = p1;//r(2)
rect.center = p1;//r(3)
draw(p1);
array=[[NSMutableArray alloc]initWithCapacity:10];
[array addObject:p1];//r(4)
// --------------- 引用计数 release -1操作
p1 = nil;//r(3)
p2 = nil;//r(2)
rect.center = nil;//r(1)
[array removeObjectAtIndex:0];//r(0)
NSLog(@"continue......");
}
参考
http://blog.csdn.net/likendsl/article/details/10900469
自动释放池(autoreleasepool)
*release会导致对象立即释放。如果频繁对对象进行release,可能会造成琐碎的内存管理负担,aotorelease可以将release的调用延迟到自动释放池被释放时。
*推荐使用自动释放池BLock,当其结束时,所有接受autorelease消息的对象会被立即释放。
*AppKit和UIKit框架在处理每一次事件循环迭代时,都会讲其放入一个AutoRelease Pool中,绝大多数情况,无序程序员干预。
//及时早一点的被释放
void poolDemo(){
@autoreleasepool {
for (int i = 0; i < 10; i++) {
__unused BLNRectangle *rect = [[BLNRectangle alloc]init];
}
}
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSLog(@"-------ARC Demo: ----------");
arcDemo();
NSLog(@"-------Autorelease Pool Demo: ----------");
poolDemo();
}
return 0;
}