<span style="font-size:18px;">
属性与内存管理(属性与内存管理都是相互关联的)第一部分一,属性:属性是OC2.0之后出来的新语法,用来取代setter和getter方法,使用属性能够高速创建setter以及getter方法的声明,setter和getter方法的实现,另外加入了对实例变量操作的安全处理(其安全是通过内存管理实现的)setter 方法作用:为单一的实例变量又一次赋值, 规范: (- 号方法)无返回值, 名字以set开头后面加上要设置的实例变量的名字,该方法有且仅仅有一个參数,參数的类型和实例变量类型同样getter 方法作用:获取某一单一变量的值, 规范: (- 号方法)有返回值,返回值类型与要获取的实例变量的类型同样,名字与要获取的实例变量的名字同样,无參数实例变量依托于对象存在,为对象开辟空间是依据实例变量的空间大小开辟的1,属性的三大特性 (关于语义特性的具体使用方法此处不再具体叙述,以下会讲解)第一大特性:(1),readonly:告诉编译器,属性在自己主动生成方法时,仅仅会生成getter方法,不会生成setter方法(2),readwrite:告诉编译器,输出在自己主动生成方法时,既要生成getter方法,也要生成setter方,系统默认的读写特性第二大特性: 原子特性(1),atomic:原子特性,保证线程安全,内部做了安全处理(加锁与解锁)(2),nonatomic:非原子特性,不保证线程安全,由于对于getter和setter方法的使用比較频繁,在一段时间内可能要訪问多次,使用atomic会很消耗系统资源,降低程序的运行效率,使用nonatomic尽管不保证线程安全,可是使用普通情况下是安全的,因此对于原子特性通常使用nonatomic第三大特性:语义特性(1),assign:直接赋值,适用于基本数据类型,也可适用于对象类型,系统默认的语义特性(2),copy:适用于对象类型,而且要服从NSCopying协议的对象,会复制出一个新的对象,拥有新的对象全部权,(引用计数 + 1)(临时这样理解内存管理会具体介绍),(3),retain:适用于对象类型,会造成对象的引用计数 + 1;2,属性的定义@property(keyword,用来定义属性) + 属性的特性 + 属性的类型 (和实例变量类型同样)+ 属性名 (和实例变量名同样);  当中@property在.h文件里仅仅是自己主动声明setter和getter方法的声明3,在.m文件里@synthesize(keyword)  属性的实现部分,实现属性自己主动生成的setter和getter方法,假设在.m文件里通过@synthesize对属性进行合成,系统会自己主动合成,仅仅只是此时系统默认的setter和getter方法内部操作的实例变量是_属性名,我们通常情况下在.m文件里有关getter和setter的方法都是什么都不写(1),假设指定的实例变量在.h文件里未定义,系统会自己主动生成指定的实例变量,可是生成的实例变量是私有的,子类不能够直接訪问,假设实例变量想让子类继承,则必须在.h文件里定义实例变量.假设属性的实现部分没有指定内部所要操作的实例变量时,系统会自己主动生成一个和属性名一样的实例变量(2),假设对于setter和getter方法我们已经实现了系统就不会再自己主动生成(3),假设在.m文件里通过@synthesize对属性进行合成,系统会自己主动合成,仅仅只是此时系统默认的setter和getter方法内部操作的实例变量是_属性名以下举个Person类的样例说明(1), 在.h文件里@interface Person :NSObject//这里定义实例变量是位了让子类继承,假设不写,系统默认生成的是私有的实例变量,(当然假设没有子类这里全然能够不写){NSString*_name; //姓名NSString *_sex;  //性别NSInteger _age; //年龄NSString *_job;//工作}//定义属性将name的语义特性声明为retain,sex的语义特性声明为copy,job的语义特性声明为assign(系统默认的时assign,这里能够不写)@property (nonatomic,retain) NSString *name;@property (nonatomic, copy) NSString *sex;@property (nonatomic) NSInteger age;@property (nonatomic) NSString *_job;@end(2), 在.m文件里  (把不同特性的setter和getter方法的内部实现具体的写出来,以便清楚的了解系统内如生成的代码)在实现方法之前首先说明,在实现setter和getter方法时,内部绝对不能够出现self.+属性名.由于这样写相当于自己调用自己,会形成死循环1), 把name语义特性声明为retain时,setter和getter方法的内部实现setter方法:- (void)setName:(NSString *)name{if (_name != name) {[_namerelease];_name = [name retain];}}getter方法:- (NSString *)name{return [[_nameretain] autorelease];}2),把性别sex语义特性声明为copy时,setter和getter方法的内部实现setter方法:- (void)setSex:(NSString *)sex{if (_sex != sex) {[_sexrelease];_ sex = [sex copy];}}getter方法:- (NSString *)sex{return [[_sexretain] autorelease];}3),把job语义特性声明为assign时,setter和getter方法的内部实现setter方法:- (void)setJob:(NSString *)job{_job = job)}getter方法:- (NSString *)job{return_job;}4), age默认的语义特性为assign时,setter和getter方法的内部实现setter方法:- (void)setAge:(NSInteger)age{_age != age)}getter方法:- (NSString *)age{return_age;}这里这样写的原因以下内存管理介绍二,(一),内存管理简单介绍:1,iOS应用程序出现Crash(闪退)。90%以上的原因是内存问题。在一个拥有数十个甚至是上百个类的project里,查找内存问题极其困难。了解内存常见问题,能帮我们降低出错几率。

2,内存问题体如今两个方面:内存溢出、野指针异常。

了解内存管理,能帮我 们提升程序性能。大大降低调试bug时间。 3,内存管理机制分为三种: (1),垃圾回收(gc) 垃圾回收:程序猿仅仅须要开辟内存空间,不须要用代码显示地释 放,系统来推断哪些空间不再被使用,并回收这些内存空间。以便再 次分配。整个回收的过程不须要写不论什么代码。由系统自己主动完毕垃圾回 收。Java开发中一直使用的就是垃圾回收技术 (2),MRC(Manual Reference Count)人工引用计数: 内存的开辟和释放都由程序代码进行控制。相对垃圾回收来说,对内存 的控制更加灵活。能够在须要释放的时候及时释放,对程序猿的要求较 高,程序猿要熟悉内存管理的机制 (3),ARCAuto Reference Count)自己主动引用计数: iOS 5.0的编译器特性,它同意用户仅仅开辟空间,不用去释放空间。 它不是垃圾回收。它的本质还是MRC,仅仅是编译器帮程序猿默认加了释放 的代码。

4,对于iOS支持两种内存管理方式:ARC和MRC C语言中,使用malloc和free。进行堆内存的创建和释放。堆内 存仅仅有正在使用和销毁两种状态。实际开发中,可能会遇到。两个以上 的指针使用同一块内存。C语言无法记录内存使用者的个数。 而OC採用引用计数机制管理内存。当一个新的引用指向对象 时,引用计数器就递增,当去掉个引用时,引用计数就递减,当 引用计数到零时。该对象就会释放占有的资源 (二),内存管理基本原则: 假设对一个对象进行alloc,retain,copy之后,就拥有了该对象的使用权,就必须 对该对象进行release或者autorelease.即(谁使用+1操作,谁就要进行-1操 作) 1,将OC里仅仅能利用以下五种方法对引用计数改变: (1),alloc:(+号方法)(与dealloc相应) 开辟堆区的内存空间,将对象的引用计数由0 变 1(+ 1操作); (2),copy:(-号方法) 又一次开辟空间与要拷贝的对象(即空间)开辟的空间大小一样,里面存储的内容也全然一样,仅仅是地址不同,引用计数由0 到 1(+ 1操作,这里不是对原对象的引用计数 + 1,而是对新拷贝的对象+ 1); (3),retain:(-号方法)与release相应使用对象的引用计数 + 1(操作后马上 + 1), (4),release:(-号方法)与retain相应使用对象的引用计数 - 1(操作后马上 - 1), (5),autorelease:(-号方法) 对象的引用计数 - 1(不会马上 – 1,会在未来的某一时刻引用计数 – 1),仅仅要有对象使用autorelease操作,就必须有相应的自己主动释放池autoreleasePool{},自己主动释放池工作原理:它会将声明为autorelease的对象放入离它近期的自己主动释放池中,当自己主动释放池销毁时,会向池中的每一个对象发送一个release消息,因此使用autorelease实质的-1操作不是autorelease进行的还是release运行的 2,retainCount 用来获取当前对象的引用计数(针对自己定义的类,系统的类我们不须要了解,由于其内部做了好多操作), 3,dealloc: 回收空间(与alloc相应)当该类型的对象引用计数为0时, 系统会自己主动调用dealloc方法来回收空间,该方法不须要手动调用, 4,当对象的引用计数为变为0时,不能在訪问该对象,即不要对该对象做任 何操作,假设继续操作就会出现野指针问题,这时可能会写到某行代码时突 然crash(即使是没有写不论什么与引用计数相关的代码),由于此时系统已经自己主动回收了指针变量指向的空间,该指责你变量已经没有使用被收回的空间的权限了,也就不能訪问没有权限的对象. 5,查找系统由于野指针问题崩溃的时哪一行代码: 在菜单条上点击Product ->Scheme ->Edit Scheme->选中Objective-c那行的Enable Zomible Object 和 Debugger以下的最后一行,又一次运行,就可以找到哪里出错了. 6, 当写完和引用计数相关的代码后程序马上crash,是由于系统被回收后又使用了引用计数 - 1有关的操作,这时应该将其删除 7,我们平时要养成随时在对象后面记录对象当前的引用计数,以降低出错的概率 8,验证对象空间是否被回收,仅仅有查看该类的dealloc方法有没有运行就可以 三,以下仍以Person为例具体介绍 setter和getter方法,内部是对实例变量赋值以及实例变量的取值操作,全部方法内部要操作实例变量 1,把name语义特性声明为retain时,setter和getter方法的内部实现 setter方法: - (void)setName:(NSString *)name { if (_name != name) { [_namerelease]; _name = [name retain]; } } getter方法: - (NSString *)name { return [[_nameretain] autorelease]; } (1), if (_name != name)推断条件目的: 推断原有对象和新对象是否是同一个,假设是同一个就不是必需又一次赋值了,否则会先release, release后空间就被系统回收了,此时若再retain就会出现野指针问题 (2), [_namerelease]操作的目的: 释放保有的之前对象的全部权,若不释放会造成内存泄露,由于前一个对象已经不再使用了 (3), _name = [name retain]操作的目的: 让实例变量保有新的对象全部权,retain攻克了野指针问题 2,把性别sex语义特性声明为copy时,setter和getter方法的内部实现 setter方法: - (void)setSex:(NSString *)sex { if (_sex != sex) { [_sexrelease]; _ sex = [sex copy]; } } 针对setter方法 (1), if (_sex != sex)推断条件目的: 推断原有对象和新对象是否是同一个,假设是同一个就不是必需又一次赋值了,否则会先release, release后空间就被系统回收了,此时若再retain就会出现野指针问题 (2), [_sexrelease];操作的目的: 释放保有的之前对象的全部权,若不释放会造成内存泄露,由于前一个对象已经不再使用了 (3), _ sex = [sex copy];此处的copy操作跟上面的retain操作有所不同,copy是把sex指向的空间复制一份(即又一次开辟一个空间,大小跟sex指向的空间大小一样,空间里存储的数据都同样),的操作的目的:让实例变量保有新的对象全部权,retain攻克了野指针问题, getter方法: - (NSString *)sex { return [[_sexretain] autorelease]; } 3,把job语义特性声明为assign时,setter和getter方法的内部实现 setter方法: - (void)setJob:(NSString *)job { _job = job) } 这里由于job的语义特性为assign,所以其内部的操作是直接赋值的方式 getter方法: - (NSString *)job { return_job; } 4, age默认的语义特性为assign时,setter和getter方法的内部实现 setter方法: - (void)setAge:(NSInteger)age { _age != age) } 这里age为基本数据类型,为它开辟的空间是在栈区的,除了堆区须要手动管理,其它的内存区域都是系统管理,对基本数据类型系统默认的语义特性为assign, 所以其内部的操作也是是直接赋值的方式 getter方法: - (NSString *)age { return_age; } </span>

属性与内存管理(属性与内存管理都是相互关联的)相关推荐

  1. java 多线程 内存泄露_关于内存泄露的总结

    大致先分为五个小模块: 1.什么是内存泄漏 2.有哪些情况会导致内存泄漏切如何解决 3.如何检测内存泄漏 4.Java得基本数据类型和占用字节 5.什么是内存溢出和解决办法 一.什么是内存泄漏(Mem ...

  2. python3高级语法:__slots__属性、property装饰器、上下文管理协议、__new__方法

    #practice29:派生内置不可变类型并修改其实例化行为(以tuple为例) __new__() is intended mainly to allow subclasses of immutab ...

  3. javafx阴影_JavaFX技巧23:节省内存! 属性的阴影场

    javafx阴影 Java 8中引入的属性和属性绑定是非常有用的编程概念. 当您开发用户界面时,它们特别有用. 实际上,它们是如此有用,以至于开发人员成为所有事物都应该是属性而不是原始属性的想法的受害 ...

  4. javafx阴影_JavaFX技巧来节省内存! 属性和可观察对象的阴影场

    javafx阴影 在 JavaFX的世界中, Properties API允许UI开发人员将值绑定到UI控件. 这种功能出奇的简单,但是当对象模型经常使用属性时,应用程序可能会很快耗尽内存. 我通常会 ...

  5. JavaFX技巧23:节省内存! 属性的阴影场

    Java 8中引入的属性和属性绑定是非常有用的编程概念. 当您开发用户界面时,它们特别有用. 实际上,它们是如此有用,以至于开发人员成为所有事物都应该是属性而不是原始属性的想法的受害者. 不幸的是,他 ...

  6. JavaFX技巧来节省内存! 属性和可观察物的阴影场

    在 JavaFX的世界中, Properties API允许UI开发人员将值绑定到UI控件. 这种功能非常容易,但是当对象模型经常使用属性时,应用程序可能会很快耗尽内存. 我通常会编写两个单独的对象, ...

  7. linux delete内存不下降_linux内存分配管理

    linux内存分配管理 一.前言 作为从事与C/C++程序开发人员,我们一直需要很好的管理内存,申请和释放:可能很多只知道使用malloc.new去申请,使用free.delete去释放,但是,去根究 ...

  8. java.nio.DirectByteBuffer管理堆外内存

    堆外内存 堆外内存是相对于堆内内存的一个概念.堆内内存是由JVM所管控的Java进程内存,我们平时在Java中创建的对象都处于堆内内存中,并且它们遵循JVM的内存管理机制,JVM会采用垃圾回收机制统一 ...

  9. linux进程管理内存管理,Linux专业知识四:Linux系统进程管理及查看内存

    本文主讲Linux专业知识之Linux系统进程管理及查看内存的情况,以Redhat RHEL7操作系统为例. 一.进程 程序与进程:程序是静态的(文件),进程是动态的(运行的程序). 进程和线程:一个 ...

最新文章

  1. Win7 IIS7 HTTP 错误 404.2 - Not Found解决方法 ISAPI CGI
  2. linux系统 wm9713声卡配置 记录
  3. PMCAFF | 为什么我们必须关注95后市场?
  4. 【Text_Classification】学习到的语法知识
  5. Google、MS和BAT教给我的面试真谛
  6. x86 32位oracle,X86 32位和64位的区别
  7. 容器操作系统虚拟化_为什么操作系统在容器化世界中很重要
  8. 马斯克身家742亿美元超微软前CEO鲍尔默 成全球第5大富豪
  9. R中读取Excel大文件
  10. TS入门——01.数据类型
  11. Typora下载链接
  12. 北京计算机专业考研录取分数线,2018北京航空航天大学计算机考研复试分数线_计算机考研分数线...
  13. 主板供电接口 图解安装详细过程
  14. 文献阅读1:Deep Learning for Image Super-resolution: A Survey
  15. E - Enigma Gym - 101889E dp求可除一个整数的最小数
  16. 操作系统笔记(一)——操作系统的定义及作用
  17. (万字超详细的复习资料丨没有之一)通信原理考试复习资料,按需收藏加关注。
  18. easyrecovery2023免费绿色版电脑数据恢复软件
  19. 串口调试助手总是多发送两个字节 0d 0a
  20. JavaEE学习路线(经典必看)

热门文章

  1. Spring整合Hessian
  2. slave-pxc后GTID不一致
  3. 简单定制自己的Centos系统(第三版)
  4. Prometheus监控的最佳实践——关于监控的3项关键指标
  5. Laravel5.4 使用Carbon人性化显示发表评论中文时间
  6. 关于python使用cv画矩形并填充颜色同时填充文字
  7. linux shell 中的sleep命令
  8. [iOS]提交App报错ERROR ITMS -90207
  9. NHibernate之映射文件配置说明(转载2)
  10. Rainmeter 一部分 语法 中文教程