47 熟悉系统框架

总结:将代码封装为动态库,并提供接口的头文件,就是框架。平时的三方应用都用静态库(因为iOS应用程序不允许在其中包含动态库),并不是真正的框架,然而也经常视为框架。例如:NSLinguisticTagger可以解析字符串并找到其中的全部名词、动词、代词等。无缝桥接:将CoreFoundation中的C语言数据结构平滑转换为Foundation中的Objective-C对象,也可反向转换。OC编程一个重要特点是,经常需要使用底层的C语言级API,用C语言来实现API的好处是,可以绕过OC的运行期系统,从而提升执行速度。coreAnimation是OC写成的,是QuartzCore框架的一部分。CoreGraphics框架以C语言写成。很多常见任务都能用框架来做。

48 多用块枚举,少用for循环

总结:四种方式:一for循环,二NSEnumerator(OC1.0),三快速遍历(OC2.0)语法更简洁,如果某各类要支持快速遍历可以宣称支持NSFastEumeration协议(只有一个方法),四基于块的遍历遍历时既能获取对象,也能知道其下标。还可以终止遍历操作。块还可以修改方法签名,知道待遍历的collection含有何种对象,指出对象的具体类型。块还可以传入选项掩码通过GCD来并发执行遍历操作,无须另行编码。

49 对自定义其内存管理语义的collection使用无缝桥接

总结:__bridge,__bridge_retained,__bridge_transfer。coreFoundation框架中的称为数据结构。通过无缝桥接技术,可以在Foundation框架中的OC对象与CoreFoundation框架中的c语言数据结构之间来回转换。在CoreFoundation层面创建collection时,可以指定许多回调函数,这些函数表示此collection应如何处理其元素。然后,可运用无缝桥接技术,将其转换成具备特殊内存管理语义的OC collection。(有时候Key是不支持拷贝操作的)

50 构建缓存时选用NSCache而非NSDictionary

总结:NSCache的好处:当系统资源将要耗尽时,可以自动删减缓存,还会先行删减最久未使用的对象。不会拷贝键,而是保留键。线程安全。开发者可以操控缓存删减其内容的时机。有两个与系统资源相关的尺度可供调整,其一是缓存中的对象总数,其二是对象的总开销。缓存的本意是增加应用程序响应用户操作的速度。

////如果存在缓存则使用缓存的数据,如果没有缓存,则重新下载数据

//- (void)downloadDataForUrl:(NSURL *)url{

//    NSData *cacheData = [_cache objectForKey:url];

//    if (cacheData) {

//        [self useData:cacheData];

//    }

//    else{

//        SMNetworkFetcher *fetcher = [[SMNetworkFetcher alloc]initWithUrl:url];

//        [fetcher startWithCompletionHandler:^(NSData *data){

//            [_cache setObject:data forKey:url cost:data.length];

//            [self useData:data];

//        }];

//    }

//}

- (void)downloadDataForUrl:(NSURL *)url{

NSPurgeableData *cacheData = [_cache objectForKey:url];

if (cacheData) {

[cacheData beginContentAccess];

[self useData:cacheData];

[cacheData endContentAccess];

}

else{

SMNetworkFetcher *fetcher = [[SMNetworkFetcher alloc]initWithUrl:url];

[fetcher startWithCompletionHandler:^(NSData *data){

NSPurgeableData *cacheData = [NSPurgeableData dataWithData:data];

[_cache setObject:cacheData forKey:url cost:data.length];

//            [cacheData beginContentAccess];

//创建purgeable对象之后,purge引用计数会多1,所以无需再调用beginContentAccess

[self useData:data];

[cacheData endContentAccess];

}];

}

实现缓存时应选用NSCache而非NSDictionary对象。因为NSCache可以提供幽雅的自动删减功能,而且是“线程安全的”。此外,它与字典不同,并不会拷贝键。可以给NSCache对象设置上限,用以限制缓存中对象总个数及“总成本”,而这些尺度则定义了缓存删减其中对象的时机。但是绝对不要把这些尺度当成可靠的“硬限制”,它们仅对NSCache起指导作用。将NSPurgeableData与NSCache搭配使用,可实现自动清除数据的功能,当NSPurgeableData对象所占内存为系统所丢弃时,该对象自身也会从缓存中移除。只有那种“重新计算起来很费事的”数据,才值得放入缓存,比如需要从网络获取或从磁盘读取的数据。

51 精简initialize与load的实现代码

总结:load:对于加入运行期系统中的每个类及分类来说,在应用程序启动时,必定会调用此方法,先调用类中的再调用分类的,先执行超类的load方法,再执行子类的,而且仅调用一次。在load中使用其他类是不安全的。因此load方法的实现要精简一些,因为整个应用程序在执行load方法时都会阻塞。initialize:首次调用该类之前调用,且之调用一次。是由运行期系统来调用,绝不应该通过代码直接调用。惰性调用。如果本类未实现,而其超类实现了,就会运行其超类的实现代码,遵循继承规则。

在加载阶段,如果类实现了load方法,那么系统就会调用它,分类里也可以定义此方法,类的load方法要比分类中的先调用。与其他方法不同,load方法不参与覆写机制。首次使用某个类之前,系统会向其发送intialize消息,由于此方法遵从普通的覆写规则,所以通常应该在里面判断当前要初始化的是哪个类。load与initialize方法都应该实现的精简写,这有助于保持应用程序的响应能力,也能减少引入“依赖环”的几率。无法在编译器设定的全局常量,可以放在initialize方法里初始化。

52 别忘了NSTimer会保留期目标对象

总结:计时器要和运行循环相关联,运行循环到时候会触发任务。也可以先创建好,由开发者自己来调度。计时器会保留其target对象,等到自身失效时再释放此对象。调用invalidate方法可令计时器失效。执行完相关任务后,一次性的计时器也会失效。NSTimer对象会保留其目标,直到计时器本身失效为止,调用invalidate方法可令计时器失效,另外,一次性的计时器再出发完任务后会失效。反复执行任务的计时器,很容易引入保留环,如果这种计时器的目标对象又保留了计时器本身,那肯定会导致保留环,这种环装保留关系,可能是直接发生的,也肯能是通过对象图里的其他对象间接发生的。可以扩充NSTimer的功能,用块来打破保留环。不过,除非NSTimer将来在公共接口里提供此功能,否则必须创建分类,将相关实现代码加入其中。

effective OC2.0 52阅读笔记(七 系统框架)的更多相关文章

  1. effective OC2.0 52阅读笔记(二 对象、消息、运行期)

    第二章:对象.消息.运行期 6 理解属性这一概念 总结:OC解决硬编码偏移量问题的做法,一种方案是把实例变量当做一种存储偏移量所用的特殊变量,交由类对象保管,偏移量会在运行期查找,叫做稳固的“应用程序 ...

  2. effective OC2.0 52阅读笔记(六 块与大中枢派发)

    派发队列:dispatch_queue 操作队列:NSOperationQueue  组:dispathc_group_t 37 理解“块”这一概念 总结:块就是一个值,且自有其相关类型.块的强大之处 ...

  3. effective OC2.0 52阅读笔记(五 内存管理)

    第五章:内存管理 29 理解引用计数 30 以ARC简化引用计数 总结:ARC通过命名约定将内存管理规则标准化.其他编程语言很少像OC这样强调命名.ARC通过设置全局数据结构(此数据结构的具体内容因处 ...

  4. effective OC2.0 52阅读笔记(三 接口与API设计)

    第三章:接口与API设计 15 用前缀避免命名空间冲突 总结:避免重名符号错误的唯一办法是变相实现命名空间.为所有符号都加上命名前缀.类和分类都应加三字前缀.注意类实现文件中的纯C函数及全局变量,是算 ...

  5. effective OC2.0 52阅读笔记(一 熟悉Objective-C)

    第一章:熟悉Objective-C 1 了解objective-c语言的起源 总结:OC为C语言添加了面向对象的特性,是其超集.采用动态绑定的消息结构而非函数调用,也就是说,要在运行时才检查对象类型及 ...

  6. effective OC2.0 52阅读笔记(四 协议与分类)

    23 通过委托与数据源协议进行对象间通信 总结:委托模式的常规委托模式中,信息从类Class流向受委托者delegate.数据源模式,信息从数据源datasource流向class.数据源和受委托者可 ...

  7. 论文阅读笔记七:Structure Inference Network:Object Detection Using Scene-Level Context and Instance-Level Relationships(CVPR2018)

    结构推理网络:基于场景级与实例级目标检测 原文链接:https://arxiv.org/abs/1807.00119 代码链接:https://github.com/choasup/SIN Yong ...

  8. elasticsearch 权威指南聚合阅读笔记(七)

    count(1) select clssId,count(1) from student group by  classId { "size":0, "aggs" ...

  9. 云时代架构阅读笔记七——Java多线程中如何使用synchronized关键字

    关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨synchronized关键字. sy ...

随机推荐

  1. jQuery浏览器类型判断和分辨率判断

    < DOCTYPE html PUBLIC -WCDTD XHTML TransitionalEN httpwwwworgTRxhtmlDTDxhtml-transitionaldtd> ...

  2. VirtualBox装ghost XP

    在win7 professional 64上安装了virtualBox4.3.14 r95030 版本,之所以要安装这个vb,是因为刚升级的vm 打开之后很占用cpu, 网上又说vb不是很占用cpu而 ...

  3. 验证LeetCode Surrounded Regions 包围区域的DFS方法

    在LeetCode中的Surrounded Regions 包围区域这道题中,我们发现用DFS方法中的最后一个条件必须是j > 1,如下面的红色字体所示,如果写成j > 0的话无法通过OJ ...

  4. NPOI操作EXCEL(一)——npoi基础

    去年项目有一个子模块需要解析上百张不一样的excel表格入库,当时用的NPOI,做了很久...也尝试想把代码分享到oschina,结果没坚持两篇就放弃了. 赶巧的是,昨天运营那边提出要录入一些基础数据 ...

  5. 我是服务的执政官-服务发现和注册工具consul简介

    服务发现和注册 我们有了两个服务.服务A的IP地址是192.168.0.1,端口9001,服务B的IP地址192.168.0.2,端口9002.我们的客户端需要调用服务A和服务B,我们只需要在配置文件 ...

  6. Codeforces Canda Cup 2016

    A.B:模拟 C.构造下就行了 D.题意:n个参加ACM的队(n<=300000),每个队都有自己的初始气球数和重量,规定如果气球数>重量,那么此队就会飞起来,淘汰出局,你现在是第一组,你 ...

  7. 如何指定个别属性进行transition过渡

    transition是CSS3新增的动画属性,可以实现属性的平滑过渡,大大提高用户体验,对于多个属性进行过渡的话很多人会这样写 .tr{ transition:all 1s} 很不幸的是如果我只需要对 ...

  8. 运维自动化轻量级工具pssh

    1pssh介绍 pssh是python写的可以并发在多台机器上批量执行命令的工具,它的用法可以媲美ansible的一些简单用法,执行起来速度比ansible快它支持文件并行复制,远程命令执行,杀掉远程 ...

  9. 【USACO 2.3】The Longest Prefix

    题意: 给你一个少于200000的字符串,求最长的可以划分为给定词典里的单词的前缀. 题解: dp[i]表示第i位结尾的前缀是否可行,然后枚举每一位如果dp[i-1]==1,枚举所有单词,匹配成功的单 ...

  10. PHPExcel读取excel文件

    <?php set_time_limit(0); $dir = dirname(__FILE__);//当前脚本所在路径 require $dir."/PHPExcel_1.8.0/C ...