@chenbinghua
2015-09-12T10:32:32.000000Z
字数 1040
阅读 1295
iOS笔记
存放在堆的OC对象
引用计数器
谁创建谁release
// retain关键字
- (void)setCar:(Car *)car
{
if (car != _car)
{
// 对当前正在使用的车(旧车)做一次release
[_car release];
// 对新车做一次retain操作
_car = [car retain];
}
}
- (void)dealloc
{
// 当人不在了,代表不用车了
// 对车做一次release操作
[_car release];
[super dealloc];
}
p.dog = [[Dog alloc] init];
[[Dog alloc] init].weight = 20.8;
// MRC下的正确写法
Dog *dog = [[Dog alloc] init];
p.dog = dog;
[dog release];
Dog *dog = [[Dog alloc] init];
dog.weight = 20.8;
[dog release];
控制set方法的内存管理
retain : release旧值,retain新值(用于OC对象)
assign : 直接赋值,不做任何内存管理(默认,用于非OC对象类型)
copy : release旧值,copy新值(一般用于NSString *)
控制需不需生成set方法
readwrite :同时生成set方法和get方法(默认)
readonly :只会生成get方法
多线程管理
atomic :性能低(默认)
nonatomic :性能高
控制set方法和get方法的名称
setter : 设置set方法的名称,一定有个冒号:
getter : 设置get方法的名称
当ARC开启时,编译器将自动在代码合适的地方插入retain, release和autorelease,而作为程序猿,完全不需要担心编译器会做错(除非开发者自己错用ARC了)。
在工程中使用ARC非常简单:只需要像往常那样编写代码,只不过永远不写retain,release和autorelease三个关键字就好~这是ARC的基本原则。
ARC是编译器特性,而不是运行时特性
ARC不是其它语言中的垃圾回收, 有着本质区别
ARC的优点
完全消除了手动管理内存的烦琐, 让程序猿更加专注于app的业务
基本上能够避免内存泄露
有时还能更加快速,因为编译器还可以执行某些优化
只要还有一个强指针变量指向对象,对象就会保持在内存中