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 

原文地址:https://www.cnblogs.com/lisaloveyou1900/p/10204946.html

时间: 12-31

iOS 内存管理之属性关键字的相关文章

IOS 内存管理

一.前言 对于大多数从C++或者JAVA转过来学习Object-C(以下简称OC)的人来说,OC这门语言看起来非常奇怪,用起来也有点麻烦. OC没有像JAVA一样的垃圾回收机制,也就是说,OC编程需要程序员手动去管理内存.这就是为什么它烦的原因,苹果却一直推崇开发者在有限硬件资源内写出最优化的代码,使用CPU最少,占用内存最小. 二.基本原理 对象的创建: OC在创建对象时,不会直接返回该对象,而是返回一个指向对象的指针,因此出来基本类型以外,我们在OC中基本上都在使用指针. ClassA  *

IOS内存管理

原文链接:http://blog.csdn.net/weiqubo/article/details/7376189 1.  内总管理原则(引用计数)    IOS的对象都继承于NSObject,   该对象有一个方法:retainCount ,内存引用计数. 引用计数在很多技术都用到: window下的COM组件,多线程的信号量,读写锁,思想都一样.       (一般情况下: 后面会讨论例外情况)    alloc      对象分配后引用计数为1    retain    对象的引用计数+1

iOS内存管理(一)

最近有时间,正好把iOS相关的基础知识好好的梳理了一下,记录一下内存相关方面的知识. 在理解内存管理之前我觉得先对堆区和栈区有一定的了解是非常有必要的. 栈区:就是由编译器自动管理内存分配,释放过程的区域,存放函数的参数值,局部变量等.栈是内存中一块连续的区域,它的大小是确定的. 堆区:需要我们来动态的分配,释放,也就是我们内存管理的主角. 我们通过一个简单的例子来看看. NSString *string = [NSString alloc] init]; 我们声明了一个NSString类型的变

【Bugly干货分享】iOS内存管理:从MRC到ARC实践

Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 对于iOS程序员来说,内存管理是入门的必修课.引用计数.自动释放等概念,都是与C语言完全不同的.搞明白这些,代码才有可能不 crash.然而就是这么牛逼的内存管理,着实让我这个从 C 转过来的老程序员头疼了一段时间. [C++ 程序员的迷惑和愤怒] iOS 内存管理的核心是引用计数.与众多五年甚至更多以上开发经验的程序员一样,笔者当初是

谈谈ios内存管理--持续更新

本文主要谈谈ios内存管理的发展脉络,不足之处,还请指教,相互学习交流.做ios开发,永远无法避开内存管理,无论我们是否有意识去考虑这个事情,但是只要我们写了OC程序,那么就与内存管理有关. 一.内存管理是做什么的? 二.内存管理方式一:MRC (一)引用计数器 (二)原则 (三)alloc.new.copy.mutableCopy.retain.release.dealloc alloc内部实现 引用计数表 (四)autorelease 三.内存管理方式二:ARC (一)__strong (二

iOS内存管理个人总结

一.变量,本质代表一段可以操作的内存,她使用方式无非就是内存符号化+数据类型 1.保存变量有三个区域: 1>静态存储区 2>stack 3>heap 2.变量又根据声明的位置有两种称呼: 1>全局变量 2>局部变量 3.三种存储区分别存储那种变量 1>静态存储区 - 在编译分配空间的时候初始化,程序运行时存在 全局变量.静态局部变量 2>stack 栈存放局部变量(这个变量是引用变量或编辑器负责自动释放的变量,例如:int,long,double基础类型,她们并没

iOS内存管理 ARC与MRC

想驾驭一门语言,首先要掌握它的内存管理特性.iOS开发经历了MRC到ARC的过程,下面就记录一下本人对iOS内存管理方面的一些理解. 说到iOS开发,肯定离不开objective-c语言(以下简称OC).OC的内存管理机制叫做引用计数,就是一块内存地址可以同时被多个对象引用,每引用一次,引用计数都会递增1,当对象每解除一次引用,引用计数就会递减1,直到引用计数为0时,系统才会讲这块内存地址回收释放掉,这与C/C++语言有些不同,但是它们都遵守同一个内存管理法则:谁申请,谁释放. 在早些时候,iO

iOS内存管理机制

概述 我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没有得到及时释放那么就会占用大量内存.其他高级语言如C#.Java都是通过垃圾回收来(GC)解决这个问题的,但在OjbC中并没有类似的垃圾回收机制,因此它的内存管理就需要由开发人员手动维护.今天将着重介绍ObjC内存管理: 引用计数器 属性参数 自动释放池 引用计数器 在Xcode4.2及之后的版本中

iOS - 内存管理之超级大坑内存泄漏QAQ

??前段时间被分配到查内存泄漏这种大坑,不胜惶恐!!!结果还真的跳进去了,爬了好长一段时间都没爬出来QAQ.每天开着Leaks各种捣鼓爱啪啪,然后看到一大波"神奇"的内存泄露信息,头都大了. ??不过这虽然是个大坑,不过趁着这次机会可以把内存管理知识好好实践了一遍.或许现在大多数的新项目都是ARC的了,然而在一些实际的大项目中,会重用很多诺干年前(其实也就几年前)的代码,QAQ,而这些代码会有很多实现采用的是MRC的方式,所以项目中就经常可以见到混合着ARC和MRC这两种不同内存管理模

蓝懿 iOS 内存管理

今天上午大部分时间用来回顾开学以来学习的内容和讲解昨天的作业,昨天的作业在实现打中不同zomb所加分数不同这项功能时候老师巧妙的利用self.speed的值实现不同加分,而不是用赋值不同tag最后case tag值的方法判断不同僵尸加不同分数,也不是运用if ([z isMemberOfClass:[ZombC class]]) 的方法判断不同僵尸加不同分数: 下午进行了讲了内存管理,主要内容有: ARC:自动内存管理 MRC:手动内存管理 内存计数机制:内存计数表示当前对象被引用的次数,如果引