本文介绍: 文章目录熟悉系统框架要点:多用块枚举,少用for循环使用Objective-C 1.0的NSEnumerator遍历快速遍历基于块的遍历方式要点:对自定义内存管理语义collection使用无缝桥接要点构建缓冲时选用NSCache而非NSDictionary要点:精简initializeload实现代码熟悉系统框架框架:将一系列代码封装动态库,并在其中放入描述接口头文件,这样做出来的东西就叫做框架。有时为iOS平台构造第三方框架所使用的是静态库,但所有iOS平台的系统框架仍然使用

熟悉系统框架

框架:将一系列代码封装动态库,并在其中放入描述接口头文件,这样做出来的东西就叫做框架。
有时为iOS平台构造第三方框架所使用的是静态库,但所有iOS平台的系统框架仍然使用动态库。

要点:

多用块枚举,少用for循环

使用Objective-C 1.0的NSEnumerator来遍历

NSEnumerator是个抽象基类,其中只定义两个方法,供其具体子类实现

- (NSArray*)allObjects
- (id)nextObject

其中关键的方法nextObject,它返回枚举里的下个对象。等到枚举中的全部对象都已返回之后,再调用就将返回nil
Foundation框架中内建的collection类都实现了这种遍历方法例如遍历数组
请添加图片描述
虽然代码较for循环多了一点,但其真正的优势在:不论遍历哪种collection,都可以采用这套相似的语法比如遍历字典set
请添加图片描述

快速遍历

自Objective-C 2.0引入快速遍历这一功能。它为for循环开设了in关键字比如要遍历数组
请添加图片描述
如果某个类的对象支持快速遍历,则可以宣称自己遵从名为NSFastEnumeration的协议,从而令开发者可以用此语法来迭代对象。此协议定义一个方法
请添加图片描述

方法允许类实例返回多个对象,这就使得循环遍历操作更为高效。
由于NSEnumerator对象实现了NSFastEnumeration协议,所以也可以用来执行反向遍历。例如反向遍历数组
请添加图片描述

基于块的遍历方式

当前的Objective-C语言中,最新引入的一种做法就是基于块来遍历。NSArray定义了下面这个方法,它可以实现最基本的遍历功能
请添加图片描述
这个块有三个参数:分别是当前迭代针对对象,所针对下标,以及指向布尔值的指针通过最好一个参数提供的机制开发者可以终止遍历操作
例如:遍历数组:
在这里插入图片描述
方法不仅可以用来遍历数组,还可以用来遍历NSSet或者NSDictionary
请添加图片描述
请添加图片描述
块的方法签名可以修改,以免进行类型转换操作。比方说,要用“快速遍历法”来遍历字典。若已知字典中的对象必为字符串,则可以这样编码
请添加图片描述
但是改为基于块的方式来遍历,那么就可以在块方法签名中直接转换
请添加图片描述

要点:

自定义内存管理语义collection使用无缝桥接

要点:

构建缓冲时选用NSCache而非NSDictionary

开发时,经常会遇到一个问题,那就是从英特网下载图片应如何缓冲。大部分程序员都是将其保存到字典里,这样的话稍后使用时就无需再次下载了。但是NSCache这个类更好,它是Foundation框架专为处理这种任务设计的。

当系统资源将要耗尽时,它可以自动删减缓冲,这是NSDictionary所不具备的,此外,NSCache还会先行删减最久未使用的”对象。NSCache不会“拷贝”键,而是会“保留”它。且NSCache线程安全的,在开发自己编写加锁代码的前提下,多个线程可以同时访问NSCache

编写缓冲代码时,可以借助NSPurgeableData二者搭配使用效果更佳。此类是NSMutableData子类,而且实现了NSDiscardableContent协议。如果某个对象所占的内存能够根据需要随时丢弃,那么就可以实现该协议定义接口。这就是说,当系统资源紧张时,可以把保存NSPurgeableData对象的那块内存释放掉。NSDiscardableContent协议定义了名为isContentDiscarded方法,可用来查询相关内存是否已释放。

在需要访问某个NSPurgeableData对象时,可以调用beginContentAccess方法,用完之后可以调用endContentAccess方法。这些调用可以嵌套,所以就像引用计数机制一样。

如果将NSPurgeableData对象加入NSCache,那么当该对象为系统所丢弃时,也会自动从缓冲中移除通过NSCacheevictsObjectsWithDiscardedContent属性,可以开启或者关闭功能

创建好NSPurgeableData对象之后,其“purge引用计数”会多一,所以无须在调用beginContentAccess了,然而其后必须调用endContentAccess,将多出来的“1”取消掉。

要点:

精简initialize与load的实现代码

时候,有一些类必须执行初始化操作然后才能正常使用。在Objective-C中,绝大多数类都继承至NSObject这个根类,而该类有两个方法,可用来实现这种初始化操作
首先说一下load方法,对于加入运行期系统的每个类及分类来说,必定会调用此方法,且仅调用一次如果分类和其所属的类都定义了load方法,则先调用类里的,再调用分类里的。

load方法中使用其他类是是不安全的,因为无法确认其他类是否已经加载好了。

load方法不像普通的方法那样,它并不遵从继承。如果某个类本身没实现load方法,那么不管其各级超类是否实现了此方法,系统都不会调用。

load尽量精简一些,能不写的代码就不要写,避免引起程序响应

除了load方法,就是initialize方法。对于每个类来说,该方法会在程序首次用该类之前调用,且只调用一次。它是由运行期系统来调用的,绝不是通过代码来直接调用。它与load不同,它是“惰性调用”,只有在用到相关类的时候才会调用;在运行期系统执行initialize方法时,是处于正常状态的;initialize方法与其他消息一样,如果某个类没实现它,而其超类实现了,那么就会运行其超类的实现代码,所以initialize是遵循继承规则的。

load和initialize都是尽量使这两个方法的实现代码精简,不要执行那种耗时或加锁任务

要点:

别忘了NSTimer会保留其目标对象

计时器要和“运行循环run loop)”相关联运行循环时候触发任务。只有把NSTimer放到运行循环里,才能正常触发任务

要点 :

  • NSTimer对象会保留其目标,直到计时器本身失效为止,调用invalidate方法可令计时器失效,另外,一次性的计时器在触发任务之后也会失效
  • 反复执行任务的计时器(repeatingtimer),很容易引入保留环,如果这种计时器的目标对象又保留了计时器本身,那肯定会导致保留环。这种环状保留关系,可能是直接发生的,也可能是通过对象图里的其他对象间接发生的。
  • 可以扩充 NSTimer功能,用“块”来打破保留环。不过,除非NSTimer将来在公共接口里提供此功能,否则必须创建分类,将相关实现代码加入其中。

原文地址:https://blog.csdn.net/weixin_50990189/article/details/123420506

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_24772.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注