今天主要讲的是内存的管理方法
1.IOS的内存管理中 Mac是使用的垃圾回收(gc) 有轮询延迟
手机用的是 引用计数
2.引用计数的方法:
( 1 ) alloc
alloc 开辟空间引用计数 从0 ->1
Person *p1 = [[Person alloc]initWithName:@"wanglong" age:18];
retain 使用引用计数 +1
Person *p2 = [p1 retain];
( 3 ) retainCount
计数的数字
NSLog(@"%ld",[p3 retainCount]);
( 4 ) release
release 影响引用计数 -1,
当对象的引用计数为0 的时候,该对象就会被系统释放
[p1 release];
(5) autorelease
autorelease 在未来的某一时刻引用计数 会自动-1
autorelease 需要自动释放池去-1
autorelease 是要依托自动释放池去释放的
出了自动释放池 相当于系统会给释放池中间调用了autorelease对象发送一个 release消息
自动释放池:
@autoreleasepool {[p1 autorelease];// 相当于一个栈 出入池跟出入栈一个道理}for (int i = 0; i < 10; i++) {Person *p = [[Person alloc]initWithName:@"Curry" age:21];@autoreleasepool {// 释放池加在里面好 如果i< 很大的数就可能内存溢出[p autorelease];}}
注意:类方法,便利构造器方法 使用autorelease,其他方法需要再外部释放,是一个规范( 6 ) copy
实现拷贝协议中的方法,需要满足NSCoping协议
copy方法对引用计数的影响要看你是怎么想法的,看你怎么实现copyWithZone方法
伪拷贝 拷贝完还是一个对象(直接返回)
- (id)copyWithZone:(NSZone *)zone{// 浅拷贝// 拷贝后 有两个对象 但是他们的值是同一个值 引用计数变化 被拷贝的对象不变 拷贝出来的新对象从0->1// 深拷贝 拷贝出新对象 并且 对象值也重新拷贝一份再赋值// 对字符串进行拷贝 拷贝的结果 要看字符串这个类如何实现的拷贝方法 对不可变字符串的拷贝 其实相当于 直接retain一次// 可变字符串 拷贝时 就是真拷贝了一个新的出来NSString *str = [_name copy]; Person *p = [[Person alloc ]initWithName:str age:_age];// 这叫做伪拷贝(直接返回)return p;}
( 7 ) dealloc
书写规范 一定要写在类的最上面,系统自动调用
如果重写的话:-(void)dealloc
{// 如果要写东西都写在[super dealloc]上面,防止出现野指针情况// 如果重写dealloc方法 必须要调用父类的方法// 保证 对象可以被释放[super dealloc];
}