Objective-C-内存管理

注:小编在技术上仍是有很大的纰漏,发表此博客但愿各位有路过的大牛人物给予评论,给于指正,小编在此很是感谢!此文章为小编本身作的笔记,有不当之处望请指出,小编非常感谢,若用于一些抄袭的勾当,出现一些不可挽回的问题,小编在此声明不负任何责任;程序员

内存管理数组

对象的生命周期包括如下几个时期:安全

对象初始化——>对象接收消息和执行操做——>对象被释放;多线程

 

判断一个对象是否结束,用到引用计数器;(引用计数器的基本概念)app

一、每一个人对象有一个整数值,这个整数值与对象自己关联,称为引用计数器;函数

二、当某些地方须要使用这个对象时,能够将引用计数器加1,表示使用这个这个对象;atom

三、使用完毕后,将该对象的引用计数器值减1;表示该对象已经使用完毕;spa

四、若是引用计数器为0时,表示没有地方再使用该对象了,这是系统将销毁该对象,其所占内存被收回,以便重用;线程

 

 ARC、MRC指针

一、ARC自动管理引用计数(系统默认,当前实际开发 所有使用的时ARC)

二、MRC手动管理引用计数

 

1、手动计数:

怎么去操做引用计数;

一、何时才能让引用计数加1?

   当使用alloc、new、copy、retain、引用计数加1;

二、何时才能让引用计数减1;

   当使用release、引用计数减1;

 

引用计数  是判断这个对象是否被销毁的依据;

        为何使用retain?

        为了防止对象被销毁(引用计数为0的时候会被销毁);

 

三、当引用计数 为0的时候  销毁对象的时候会调用delloc方法;

delloc方法不可以直接调用,,是系统自动调用的;

 

 一、对象引用计数为0,(对象已经被销毁的时候)对象是一个野指针(没有指向任何东西的指针)

 二、使用这个野指针  再去调用方法或者其余操做  会直接崩溃  或者  存在潜在危险(数据为空);

 三、若是对象的引用计数为0,就不要强制给这个对象return;

四、分配在栈里面的不用管理引用计数的:基本数据类型、alloc、new、cope、retain、都不用管理引用计数

 

 总结的思想就是:谁分配,谁释放;

2、自动计数;

自动释放

一、autorelease 延迟释放;

二、常常和自动释放池  配合使用;

三、NSAutoreleasePool是自动释放池的类;

四、也须要对自动释放池  实例化对象   release

五、当不知道何时对象再也不须要使用  可使用延迟释放autorelease  延迟释放;

六、放到自动释放池里面;

七、新写法@autoreleasepool{}的生命周期

1)出了花括号自动释放池结束,会触发autorelease里面全部的内容;

八、除了基本数据类型都用retain;

1)nonatomic非原子类型,在多线程的状况下,不保证在不一样线程数据的安全;

@property (nonatomic,retain)Dog *dog;

 atomic 原子类型,在多线程的状况下,保证数据的安全;

2)assign  基本数据类型使用assign

@property (nonatomic,assign) int age;

九、ARC状况下,若是这个对象在 内存不足 的时候容许它被 销毁掉用unsafe_unretained

十、ARC状况下,若是这个对象在 内存不足 的时候不容许它被 销毁掉用strong,

十一、经过引用计数  来判断是否须要销毁这个对象;

 alloc、retain、copy、new、引用计数+1;

 release、autorelease 引用计数-1;

十二、写在自动释放池生命周期之内的  带有延迟释放的  对象 都会在释放池生命周期  结束以后  释放

1三、花括号结束以后就是新写法自动释放的生命周期,, 结束的时候;

@autoreleasepool {

            Person *xiaohuang = [[[Person alloc]init]autorelease];

        }

注:@autoreleasepool是和 autorelease搭配使用的

1)局部变量的生命周期;

 定义的位置  知道定义位置存在的括号之内

2)全局变量的生命周期;

 在对象存在的时候就可使用

 1四、 分配在栈里面的数据 不须要程序员去管理内存;

 分配在堆里面的数据   须要程序员去管理内存;

 1五、属性 setter、getter 方法的内存管理;

  1)_name 如今就是main函数里面实例化的nameContent这个跟对象

  2)若是_name的retainCount在释放以前是1,调用release以后  就会销毁_name这个对象;

1五、[_dog release];//或者[self.dog release];

1六、retain  copy 的区别

retain是给原来对象的引用计数+1;

copy会生成一个新的对象;给新的引用计数+1;

1七、自定义拷贝

 除了字符串、字典、数组、NSNumber 都须要自定义拷贝 的功能,(遵照拷贝协议);

1八、深浅拷贝

 深拷贝 是彻底拷贝一个对象,这个对象与原来的对象彻底是两个个体;内存地址不同

 浅拷贝 是只拷贝对象自己,不拷贝对象里面的内容; 内存地址同样    

 1九、判断深浅拷贝的依据:

 看他们(不仅是对象的自己,也包含对象里面具体的内容)的内存地址是否一致;

注:

1)若是想让一个不可变对象 变成 可变对象 可使用 mutableCopy

        NSArray *list = @[@"dsa",@"fgdg",@"ewqe"];

        NSMutableArray *muArray = [list mutableCopy];

//        在此可使用移除、添加、替换;

        [muArray removeLastObject];

        NSLog(@"%@",muArray);

2)若是一个可变的对象  进行copy  它将变成一个不可变的对象;

        /*

        NSMutableString *string = [NSMutableString stringWithString:@"fdsfdsaga"];

        NSMutableString *stri = [string copy];

        [stri appendString:@"aaaaaaa"];

        NSLog(@"%@",stri);

         */

扩展:

NSOrderedAscending在左侧的比较值小于右侧的值;

NSOrderedDescending右侧的值小于左侧值;

c可用于判断比较的两个值相等;

相关文章
相关标签/搜索