c语言中内存管理存在问题
静态内存分配:
局部变量 栈
全局变量 数据区
动态内存分配
堆
内存分配函数 malloc calloc realloc
内存释放 free
使用原则 用完了释放
问题1. 内存泄漏 ,用完了动态分配的内存就不释放,就产生内存泄漏 解决 :用完malloc 用free
问题2.有多个指针指向动态分配出来的内存 ,当这块内存通过其中任意一个指针被释放,指针都变成野指针
如果在用指针去释放内存,会出现过度释放的问题
问题3。 函数如果返回一块动态分配内存的指针,有一个这块内存谁释放的问题
对象所有权
任何对象都可能拥有一个或者多个所有者,只要一个对象至少拥有一个所有者,他就会继续存在
cocoa所有权策略
-任何自己创建的对象都归自己所有
-使用名字以 alloc new 开头或名字中包含 copy 的方法创建的对象
-现在我们使用的是arc 在arc中,不用显示使用retain
引用计数
- retain
- release
- retainCount
#import <Foundation/Foundation.h> #import "Test.h" int main(int argc, const char * argv[]) { @autoreleasepool { NSNumber* n1=[[NSNumber alloc]init]; NSNumber* n2 =[n1 retain]; [n1 release]; [n2 release]; //1.创建一个对象 Test* t1=[[Test alloc] init]; NSLog(@"t1 retain count=%lu",(unsigned long)[t1 retainCount]); //2.把对象加入数组对象中 NSMutableArray *myArr=[NSMutableArray array]; [myArr addObject:t1]; NSLog(@"t1 retain count=%lu",(unsigned long)[t1 retainCount]); //3.对象指针赋予assgin Test* t2=t1; NSLog(@"t1 retain count=%lu",(unsigned long)[t1 retainCount]); //4.对象保留retain t2=[t1 retain]; NSLog(@"t1 retain count=%lu",(unsigned long)[t1 retainCount]); NSLog(@"t2 retain count=%lu",(unsigned long)[t2 retainCount]); //5 对象释放release [t1 release]; NSLog(@"t1 retain count=%lu",(unsigned long)[t1 retainCount]); //6.对象从数组中移除 [myArr removeObjectAtIndex:0]; NSLog(@"t1 retain count=%lu",(unsigned long)[t1 retainCount]); [t1 release]; } return 0; }
原文:https://www.cnblogs.com/zhangqing979797/p/13236892.html