iOS 内存管理之属性关键字
你好2019!一起努力呀!
主要分三种类型:
1、原子操作相关: nonatomic、atomic
nonatomic:非原子操作,对属性赋值的时候不加锁,多线程并发访问会提高访问效率
atomic:原子操作,提供多线程安全,只在其相关的setter或getter方法的时候有加锁安全机制,其他的线程安全不负责
属性默认的是原子操作,但是一般开发使用的是非原子操作。因为关于线程安全,只是依赖原子操作根本实现不了
2、内存管理相关:assign、weak、copy、strong
assign:修饰基础数据类型以及C数据类型
weak:修饰OC对象,在对象被销毁的时候会被置为nil;(下面会对weak、__weak以及涉及到的弱引用计数表相关的进行个人理解)
copy:一般用来修饰不可变类型对象以及block(关于blcok使用的关键字是从MRC的留下来的惯性关键字,在ARC上使用strong或copy均可,不过一般还是使用copy)他不会对原对象的引用计数发生变化,会生成新的地址。
strong:修饰OC对象,尤其是可变类型的属性必须使用strong修饰,它不会生成新的内存地址,会使引用计数加1
注意:
2.1:
关于weak、__weak修饰的对象
例如:__weak weakObj = tempObj; 这个执行过程会触发到的主要方法objc_initWeak(id *location,id obj) -->storeWeak --->weak_register_no_lock
其中location是指weakObj的地址,obj是指tempObj的地址(便于下边文字描述的理解)
它通过对象的内存地址做为key,而对应的__weak修饰符变量的地址作为value注册到weak表中,在对像被销毁时,执行dealloc方法最终会调用weak_clear
_no_lock方法,将这个对象对应的所有弱引用指针置为nil(objc_destroyWeak
则是销毁该对象对应的value。当指向的对象被销毁时,会通过其内存地址,去weak表中查找对应的__weak修饰符变量,将其从weak表中删除)。所以weak在修饰只是让weak表增加了记录没有引起引用计数表的变化
2.2:
关于copy、strong
常见的问题是NSString为什么使用copy而不是strong关键字,
简单说:NSString是不可变类型,,若其数据源是不可变类型,那么使用strong或copy效果都是一样的,若其数据源是可变类型的,当修改数据源的时候,使用copy修饰的字符串不会发生变化,但是使用strong修饰的会因为数据源的变化而变化。具体的情况,大家可以代码实验之!
关于数组等对象的copy单层copy(也就是对整体是深copy,数组中的对象是浅copy)
深copy、浅copy
只有源对象是不可变类型且拷贝方式是copy, 是浅copy
源对象是可变类型的时候无论拷贝方式是copy还是mutCopy,是深copy
源对象是不可变类型,但其拷贝方式是mutCopy时,是深copy
3、读写操作:readwrite、readonly(对应的setter 或 getter方法)
readwrite 会有其对应的setter和getter方法
readonly只有getter方法
4、其他关键字:@dynamic、@synthesize
被@dynamic,修饰的关键字,系统不会在生成其对应的setter 和 getter方法实现,也就是代码使用点语法的时候不会报错,但是执行赋值或取值的操作会崩溃(以为找不到相关的方法实现)
被@synthesize修饰的属性:个人理解是对属性对应的成员变量 重命名。属性默认的成员变量是在属性的前面加下划线,我们可以使用@synthesize进行重命名。并且@synthesize修饰的属性编译器会自动添加setter getter方法(当然不是用@synthesize关键字修饰,目前也是编译器自动添加的)
5、程序分区:从高地址到低地址排序
5.1:栈(先进后出)
栈的大小在编译时就已经确定了,一般是2M;栈是一块从高到低地址的连续区域。由编译器自动分配并释放,存放函数的参数值,局部变量等。栈是系统数据结构,对应线程/进程是唯一的。优点是快速高效,缺点时有限制,数据不灵活。
栈空间分静态分配 和动态分配两种。
静态分配是编译器完成的,比如自动变量(auto)的分配。
动态分配由alloca函数完成。
栈的动态分配无需释放(是自动的),也就没有释放函数。
为可移植的程序起见,栈的动态分配操作是不被鼓励的。
5.2:堆(先进先出)
堆是从低到高地址的不连续区域,分配方式类似链表;存储的为malloc , new ,alloc出来的对象。堆获得的空间比较灵活,也比较大。一般速度比较慢,容易产生碎片。
这部分的内存管理是要开发者自己管理控制的。
5.3:全局/静态
存放静态/全局变量;全局区细分为未初始化/初始化区。
5.4:常量
存放常量;程序中使用的常量会到常量区获取。
5.5:代码
存放二进制代码,运行程序就是执行代码,代码要执行就要加载进内存(RAM运行内存)。
遗留问题:
autoreleasePool
__strong
__unsafe_retained
__antoreleasing
这些相关的理解!
下次分析整理。。。。。。
其他相关连接:
关于堆栈相关的理解:https://www.jianshu.com/p/8588981a74de
iOS 内存管理之属性关键字的更多相关文章
- iOS 内存管理-copy、 retain、 assign 、readonly 、 readwrite、nonatomic、@property、@synthesize、@dynamic、IB_DESIGNABLE 、 IBInspectable、IBOutletCollection
浅谈iOS内存管理机制 alloc,retain,copy,release,autorelease 1)使用@property配合@synthesize可以让编译器自动实现getter/setter方 ...
- 浅谈iOS内存管理机制
iOS内存管理机制的原理是引用计数,引用计数简单来说就是统计一块内存的所有权,当这块内存被创建出来的时候,它的引用计数从0增加到1,表示有一个对象或指针持有这块内存,拥有这块内存的所有权,如果这时候有 ...
- 【Bugly干货分享】iOS内存管理:从MRC到ARC实践
Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 对于iOS程序员来说,内存管理是入门的 ...
- IOS内存管理学习笔记
内存管理作为iOS中非常重要的部分,每一个iOS开发者都应该深入了解iOS内存管理,最近在学习iOS中整理出了一些知识点,先从MRC开始说起. 1.当一个对象在创建之后它的引用计数器为1,当调用这个对 ...
- iOS内存管理(一)
最近有时间,正好把iOS相关的基础知识好好的梳理了一下,记录一下内存相关方面的知识. 在理解内存管理之前我觉得先对堆区和栈区有一定的了解是非常有必要的. 栈区:就是由编译器自动管理内存分配,释放过程的 ...
- iOS内存管理策略和实践
转:http://www.cocoachina.com/applenews/devnews/2013/1126/7418.html 内存管理策略(memory Management Policy) N ...
- iOS内存管理(objective-c)
移动app开发中,由于移动设备内存的限制,内存管理是一个非常重要的话题.objective-c的内存管理,不仅是面试当中老生常谈的一个必问话题,也是日常项目开发中,特别需要重视的环节.对于笔者这种以j ...
- iOS 内存管理:从 MRC 到 ARC 实践
对于 iOS 程序员来说,内存管理是入门的必修课.引用计数.自动释放等概念,都是与 C 语言完全不同的. iOS 内存管理的核心是引用计数. 接触 MRC 时遇到最头疼的问题就是:为什么那么多 rel ...
- iOS内存管理
iOS内存管理的方式是引用计数机制.分为MRC(人式引用计数)和ARC(自动引用计数). 为什么要学习内存管理? 内存管理方式是引用计数机制,通过控制对象的引用计数来实现操作对象的功能.一个对象的生命 ...
随机推荐
- CSS属性display的浅略探讨
display 的属性值有:none|inline|block|inline-block|list-item|run-in|table|inline-table|table-row-group|tab ...
- YOLO object detection with OpenCV
Click here to download the source code to this post. In this tutorial, you’ll learn how to use the Y ...
- adb调试桥(5037端口)
path里添加路径:../platform 查看设备 adb devices 杀死adb:adb kill -server 启动adb:adb start- server adb不能启动解决办法: 1 ...
- maven 依赖和坐标
1.maven 坐标由groupId.artifactId.packaging.version.classifier定义.2.classifier 用来帮助定义构建输出的一些附属构件.如,*javad ...
- MySQL无法启动、服务没有报告任何错误&初次登陆错误的解决
先以管理员身份运行cmd(右键单击左下角win菜单) 输入mysqld -install,net start mysql,下图是返回结果.报错情况以及修正之后的全过程 启动失败之后输入mysqld - ...
- Error loading XML document: dwz.frag.xml 处理方式
问题:直接用IE打开index.html弹出一个对话框:Error loading XML document: dwz.frag.xml 方案一(已经验证): 转自:http://blog.csdn. ...
- python已写内容中可能的报错及解决办法
理论上我发的每个短文,直接复制放到py里面,python xx.py是可以执行的,不过因为版本,编码什么的问题会有报错,详见这里 报错: SyntaxError: Non-ASCII characte ...
- 动态展开tableView的cell[2]
动态展开tableView的cell[2] http://code4app.com/ios/%E5%8A%A8%E6%80%81%E6%B7%BB%E5%8A%A0cell/53845f8a933bf ...
- 【原创】Qt 使用ODBC driver 连接SQL Server
最近在做数据库的课程设计.第一个需要解决的问题是使用什么工具来实现这个系统.经过一番资料查找,决定使用SQL Server Express 2012作为服务器,使用Qt作为编写客户端程序语言.问题是c ...
- print(函数.__closure__) 来判断是不是闭包, 返回cell , 是闭包, 返回None 则不是闭包
print(函数.__closure__) 来判断是不是闭包, 返回cell , 是闭包, None 则不是闭包