内存管理
一,内存管理
1.内存管理是关于如何管理对象生命周期的编程原则 。
2.OC中的内存管理只针对OC中的对象,所有的对象都继承NSObject ·
3.基本数据类型不需要管理内存。(int, long, double, float, char, struct, ....... )
4.当一个对象没有人再使用,该对象应该从内存中销毁掉 。
二,引用计数
1.所有OC的对象都有一个计数器, 这个计数器我们称为引用计数。
2.引用计数表示有几个“人”在使用当前对象。
3.每个对象都有一个retainCount引用计数,表示当前对象被引用的数量 。
4.alloc,retain,release的用法
alloc用来创建对象,创建完成之后,引用计数为1,只调用一次。
retain使引用计数+1,可以多调用几次。
release使引用计数-1,可以多调用几次。
当引用计数为0的时候会调用dealloc。
黄金法则:每次调用alloc一次,都需要调用release一次,他们两是成对出现的。
int main(int argc, const char * argv[]) { @autoreleasepool { Person *person = [[Person alloc] init];//引用计数为1 NSLog(@"引用计数:%ld",[person retainCount]); //引用计数加1 [person retain]; //引用计数减1 [person release]; NSLog(@"引用计数:%ld",[person retainCount]); [person release]; } return 0; }
5.dealloc的用法
当对象的引用计数为0时,系统调用此对象的dealloc方法。
我们应该在dealloc方法中,释放他持有的对象。
调⽤用[super dealloc]是为了释放父类持有的对象所有权。
@implementation Person - (void)dealloc{ NSLog(@"调用 dealloc 方法摧毁对象,当前引用计数为0."); [super dealloc ]; } @end
6.@property关键字
@property NSString *userName
这样定义的方式之后,这个属性就会自动有set/get方法了
第一步生成_userName属性
第二步为_userName属性自动生成set/get方法
1、第一个位置的值:
atomic:线程保护的,默认
nonatomic:线程不保护的
2、第二个位置的值:
assign:直接赋值,默认
retain:保留对象,内部会自动调用retain方法,引用计数+1
copy:拷贝对象