天天看点

OC第九天 内存管理

影响引用计数的方法: +alloc     -retain     -copy     -release     -autorelease +alloc: 开辟内存空间, 让被开辟的内存空间的引用计数由 0  +1 -retain: 引用计数+1 -copy: 把某一内存区域的内容拷贝一份, 拷贝到新的内存空间里区, 被拷贝区域的引用计数不变, 新的内存区域的引用计数为1 -release:引用计数 -1 -autorelease: 未来的某一时刻引用计数 -1(自动释放池释放时) -dealloc: 继承自父类的方法, 当对象引用计数为0 的时候, 由对象自动调用. retainCount : 系统提供的, 查看某一空间的引用计数 当对象的引用计数为0之后再去使用retainCount计算空间的引用计数就是一种错误的用法,得到错误的结果 在类的实现中添加-dealloc方法, 当对象的引用计数为0 时, 会自动调用该方法. - (void)dealloc {      [super dealloc];//注意: 一定不要忘记使用[super dealloc]      NSLog(@“回收了”); } 系统回收对象彻底释放的空间, 只是对象不再拥有该空间的所有权, 系统并不对空间清除,这也是我们在定义变量时赋初值的用意. 所谓引用计数增加是指我们在赋值时使用retain, copy等方法,如 Person *per2 = [per1, retain]; 当一个类服从了NScopying协议, 并实现了copyWithZone:方法之后, 这个类才能使用copy, 如 - (id)copyWithZone:(nullable NSZone *)zone {      Person *newPer = [[Person allocWithZone:zone] init];//开辟相同大小的空间,创建对象      newPer.name = self.name;//复制内容      newPer.age = self.age;      return newPer; 返回新的对象 } autorelease原理是将对象放到离该对象最近的自动释放池中,等待自动释放池销毁时发送release信息后执行release. 内存管理原则:      当对一个对象进行了alloc, retain, copy操作, 就要对该对象负责, 要对该对象进行释放(release, autorelease).      在一个方法内部, 要保证 对象的引用计数+ - 相等. 内存问题:      1.野指针: 对象释放完毕之后, 此时空间已经被系统收回, 如果此时再去访问该块空间就会引起野指针错误, 程序不会立即崩溃, 但是有安全隐患.      2.过度释放: 对一块已经释放过并且归还给系统的空间再次进行释放, 就会引起过度释放问题, 程序会立即崩溃.      3.内存泄露: 对一块拥有权限的空间, 在使用完之后, 没有进行释放, 系统无法将该块空间回收引起内存泄露, 不会理解及crash, 但是存在安全隐患.

继续阅读