当前位置: 首页 > news >正文

企业网站建设 新闻宣传网站开发任务清单

企业网站建设 新闻宣传,网站开发任务清单,jsp网站开发详解下载,网络公司有哪些职位文章目录前言47.熟悉系统框架CoreFoundation框架其他框架要点48. 多用块枚举#xff0c;少用for循环for循环NSEnumerator遍历快速遍历基于块的遍历方式要点49.对自定义其内存管理语义的collection使用无缝桥接要点50.构建缓存时选用NSCache而非NSDictionaryNSCacheNSCache实例… 文章目录前言47.熟悉系统框架CoreFoundation框架其他框架要点48. 多用块枚举少用for循环for循环NSEnumerator遍历快速遍历基于块的遍历方式要点49.对自定义其内存管理语义的collection使用无缝桥接要点50.构建缓存时选用NSCache而非NSDictionaryNSCacheNSCache实例要点51.精简initialize与load的实现代码loadinitalizeinitalize方法尽量精简要点52.别忘了NSTimer会保留其目标对象创建计时器保留环使用块的特点打破保留环要点总结前言 小蓝书的最后一张学习的主要内容是OC的系统框架对于OC而言Foundation框架是OC最基本最重要的框架了 47.熟悉系统框架 OC的Foundation框架像NSObject NSArray NSDictionary等类都在其中。Foundation框架里的类都是用NS前缀因为OC之前作为NeXTSTEP操作系统确定的。 将一系列代码封装为动态库并在其中放入描述其接口的头文件这样做出来的东西就叫框架。 CoreFoundation框架 Foundation框架提供了collection等基础核心功能而且还提供了字符串处理等复杂功能。还存在一个CoreFoundation框架在之前了解过他是不属于OC框架之内的但是OC应用程序的编写离不开这个框架Foundation框架的许多功在CoreFoundation框架都可以找到对应的C语言API 他其中的很多类都和Foundation框架相似并且我们还可以通过“无缝桥接”功能实现CoreFoundation框架中的C语言数据结构平滑转换为Foundation框架中的OC对象也可以反向转换。无缝桥接技术是用某些相当复杂的代码实现出来的这些代码可以使运行期系统把CoreFoundation框架中的对象视为普通的OC对象。 NSString所对应的就是CFString对象。 其他框架 CFNetWork 此框架提供了 C语言級别的网络通信能力它将 “BSD 套接字(BSDsockeD 抽象成易于使用的网络接口。而Foundation 则将该框架里的部分内容封装为 Objective-c语言的接口以便进行网络通信例如可以用 NSURLConncction 从 URI 中下载数据。CoreAudio 该框架所提供的C语言 APT可用来操作设备上的音频硬件。这个框架屆手比较难用的那科因为育频处理本身就很复东。所幸由这套 ^PL 可以抽象出另外一套Objective-C 式 API用后者米处理音频问题会更简单些。AvFoundation 此框架所提供的 Objective-C对象可用水回放并录制音频及视频比如能碰在 UI视凶类里播放视物。CoreData 此框架所提供的 Objective-C 按口可将对象放人数据便于特久保存。 CoreData 会处理数据的狀取及存储事宜而且可以路越 Mac OS X 及 iOS 平台。CoreText 此框架提供的 C诺青接口可以高效执行文字排版及谊染操作。 OC编程的重要特点就是经常需要使用底层的C语言级 API。用c语言实现 APTI的好处是可以统过 Objeotive-C 的运行期系统从而提升执行速度 在编写新的工具类之前可以在系统框架搜一下通常有写好的类可以供直接使用 要点 许多系统框架都可以直接使用。其中最重要的是Foundation与CoreFoundation这两个框架提供了构建应用程序所需的许多核心功能。很多常见任务都能用框架来做例如音频与视频处理、网络通信、数据管理等。请记住用纯C写成的框架与用OC写成的一样重要若想成为优秀的OC开发者应该掌握C语言的核心概念。 48. 多用块枚举少用for循环 在OC里列举collection中的元素可以使用C语言的for循环还可以使用快速遍历。当学习了block块特性的时候又提供了多种遍历collection的方式可以传入块。 for循环 遍历数组的时候for循环最基本 - (void)forMethod {NSArray *testArray [kd, lbj, Curry, KW, PG];for (int i 0; i testArray.count; i) {// 操作数组} }不过对于字典或者集合字典和set都是无序的所以要先把它转换为数组才可以正常使用for循环来使用 NSDictionary *textDic {LA: LBJ, PHX :KD};NSArray *allKeys [textDic allKeys];for (int i 0; i allKeys.count; i) {// 操作字典或集合}for循环还有个比较好的地方就是反向遍历在需要执行反向遍历的时候for循环往往更方便。 NSEnumerator遍历 NSEnumerator是个抽象基类其中只定义了两个方法供其具体子类来实现 关键的是其中的nextObject对象它返回枚举里的下个对象当返回不为nil的时候就会一直调用下一个对象常用while语句 数组 NSEnumerator类还提供了反向枚举器 - (void)NSEnumerator {// ArrayNSArray *testArray [kd, lbj, Curry, KW, PG];NSEnumerator *enumerator [testArray objectEnumerator];// 正向id object;while ((object [enumerator nextObject]) ! nil) {// 操作数组}// 反向NSEnumerator *reverseEnum [testArray reverseObjectEnumerator];id object2;while ((object2 [reverseEnum nextObject]) ! nil) {// 操作数组} 字典和集合 // Dict And SetNSDictionary *textDic {LA: LBJ, PHX :KD};NSEnumerator *enumertorDic [textDic keyEnumerator];id key;while ((key [enumertorDic nextObject]) ! nil) {// 操作字典id value textDic[key];} }快速遍历 快速遍历是OC2.0引入的语法功能引入了in关键字语法更加简洁了collection的遍历过程。尤其是字典类 - (void)fast {NSArray *testArray [kd, lbj, Curry, KW, PG];for (id object in testArray) {//}NSDictionary *textDic {LA: LBJ, PHX :KD};for (id key in textDic) {NSLog(%, textDic[key]);} }基于块的遍历方式 对于块的引入数组字典和集合都有自己的块遍历方法 数组 参数1是每次枚举的对象 idx是下标 stop则是代表是否停止遍历 obj array[idx]; - (void)block {NSArray *testArray [kd, lbj, Curry, KW, PG];__block NSInteger x 2;[testArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {if (x 4) {x;NSLog(%, obj);// 等效NSLog(%, testArray[idx]);*stop NO;} else {*stop YES;NSLog(x 4 STOP);}}];// }字典和集合是一样的思路。 遍历时可以直接从块里获取更多信息并且它能够修改块的方法签名以免进行类型转换操作。 块的遍历也有反向遍历数组字典集合我们需要传入一个新的选项掩码 我知道反向遍历是通过NSEnumerationReserve来实现的当然反向遍历只针对有序的数组和集合 要点 遍历collection有四种方式。最基本的办法是for循环其次是NSEnumerator遍历法及快速遍历法最新、最先进的方式则是“块枚举法”。“块枚举法”本身就能通过GCD来并发执行遍历操作无须另行编写代码。而采用其他遍历方式则无法轻易实现这一点。若提前知道待遍历的collection含有何种对象则应修改块签名指出对象的具体类型。 49.对自定义其内存管理语义的collection使用无缝桥接 “无缝桥接”技术其实就是不同库之间相同类型的相互转换。 使用“无缝桥接”技术可以在定义于Foundation框架中的OC类和定义于CoreFoundation框架中的C数据结构之间互相转换 - (void)seamlessBridging {NSArray *testArray [kd, lbj, Curry, KW, PG];CFArrayRef aCFArray (__bridge CFArrayRef)testArray;NSLog(cfArratSize %li, CFArrayGetCount(aCFArray)); }转换操作中的__bridge告诉ARC如何处理转换所涉及的OC对象。__bridge本身的意思是ARC仍然具备这个OC对象的所有权。而__bridge_retained则与之相反意味着ARC将交出对象的所有权。与之相似反向转换可通过__bridge_transfer来实现也就是将对象的所有权交给ARC。这三种转换方式称为“桥式转换” 要点 通过无缝桥接技术可以在Foundation框架中的OC对象与CoreFoundation框架中的C语言数据结构之间来回转换。在CoreFoundation层面创建collection时可以指定许多回调函数这些函数表示此collection应如何处理其元素。然后可运用无缝桥接技术将其转换成具备特殊内存管理语义的OC collection。 50.构建缓存时选用NSCache而非NSDictionary 就目前的知识而言对于从网上下载的图片如何缓存我会把图片全部放到字典里使用的时候就无需再次下载了OC提供了一个NSCache类更好的方便缓存。 NSCache NSCache类的优势在于当系统资源即将耗尽的时候自动删减缓存这是字典类不能做到的。并且遵循先删减最久未使用的对象 NSCache并非拷贝 键 而是保留 键。这和字典完全不同并且NSCache是线程安全的它在开发者不自己编写安全锁的情况下多个线程可以同时访问NSCache这对于缓存来说是很重要的多线程完成这个任务更加方便 NSCache可以令开发者操控缓存删减其内容的时机可以调整缓存里的对象总数和对象的总开销就是在讲对象加入缓存的时候开发者可以知道开销值对象总数或总开销超过上限缓存就会自动删减不需要的对象当然这个删减不能确定会不会删减掉某个必要的对象所以把对象转换成NSData对象之后把数据大小当作缓存值更合适这样避免了复杂的计算开销值变成了读取数据大小的步骤 NSCache实例 书上提供了实用NSCache的例子并引入其他的知识。 下载数据所用的URL就是缓存的键。若缓存未命中即缓存中没有访问者所需的数据则下载数据并将其放入缓存。而数据的“开销值”则设为其长度 存在一个类叫做NSPurgeableData和NSCache搭配起来用它是NSMutableData的子类而且实现了NSDiscardableContent协议。如果某个对象所占的内存能够根据需要随时丢弃那么就可以实现该协议所定义的接口。这就是说当系统资源紧张时可以把保存NSPurgeableData对象的那块内存释放掉。NSDiscardableContent协议里定义了名为isContentDiscarded的方法用来查询相关内存是否释放。 如果需要访问某个NSPurgeableData对象可以调用其beginContentAccess方法告诉它现在还不应丢弃自己所占据的内存。用完之后调用endContentAccess方法告诉它在必要时可以丢弃自己所占据的内存了。这些调用可以嵌套类似于对象的引用计数机制为0就告诉系统可以销毁对象了 将NSPurgeableData对象加入NSCache那么当该对象为系统所丢弃时也会自动从缓存中清除。通过NSCache的evictsObjectsWithDiscardedContent属性选择开启或者关闭此功能。 要点 实现缓存时应选用NSCache而非NSDictionary对象。因为NSCache可以提供优雅的自动删减功能而且是“线程安全的”此外它与字典不同并不会拷贝键。可以给NSCache对象设置上限用以限制缓存中的对象总个数及“总成本”而这些尺度则定义了缓存删减其中对象的时机。但是绝对不要把这些尺度当成可靠的“硬限制”它们仅对NSCache起指导作用。将NSPurgeableData与NSCache搭配使用可实现自动清除数据的功能也就是说当NSPurgeableData对象所内存为系统所丢弃时该对象自身也会从缓存中移除。如果缓存使用得当那么应用程序的响应速度就能提高。只有那种“重新计算起来很费事的”数据才值得放入缓存比如那些需要从网络获取或从磁盘读取的数据。 51.精简initialize与load的实现代码 在OC里一个类必须初始化才能使用大多数类继承与NSObject这个根类提供了load和initalize方法 load 加入运行期系统中的每个类和分类来说会调用此方且仅调用一次当类和分类的程序载入系统的时候就会执行这个方法调用顺序是类大于分类。 load方法执行的时候运行期系统处于脆弱状态在执行子类的load方法之前必须执行所有超类的load方法其中还会执行代码涉及到的库的load导致在load方法里面使用其他类不安全 在B类里调用A类无法保证A类已经加载完成也就是只有A的load方法执行完成才能完整的使用A类。 某个类没实现load方法那么他的超类不论实现该方法都不会调用。 load尽量不用它。 initalize 该方法是在程序首次使用该类之前调用且仅有一次是由运行期系统调用的不通过代码调用。和load存在区别 惰性调用当程序用到了相关类的时候才会调用类似于懒加载模式。而load是所有类不管用不用先load方法之后再说其次运行期在执行该方法的时候是系统正常状态也就是安全状态不影响调用类的其他方法此为线程安全。当某个类没实现initialize方法超类实现后会调用超类的方法和大多数消息是一样的。 initalize方法尽量精简 首先大家都不想看到自己的应用程序“挂起”若写的太过繁琐导致其运行很慢那就适得其反了。开发者无法控制类的初始化时机。最后如果某个类的实现代码很复杂那么其中可能会直接或间接用到其他类。若那些类尚未初始化则系统会迫使其初始化。然而本类的初始化方法此时尚未运行完毕。其他类在运行其initialize方法时有可能会依赖本类中的某些数据而这些数据此时也许还未初始化好就会造成依赖环 initalize方法只应该用来设置内部数据不能在内部调用其他的方法。 initalize还可以初始化某个无法在编译器初始化的全局变量 无法初始化数组等一些类整数可以在编译期定义。 放到initalize里面即可在调用前完成该全局变量的初始化 (void)initialize {if (self [ViewController class]) {staticArray [NSArray new];} }别忘了单例类也可以实现该目的 要点 在加载阶段如果类实现了load方法那么系统就会调用它。分类里也可以定义此方法类的load方法要比分类中的先调用。与其他方法不同load方法不参与覆写机制。首次使用某个类之前系统会向其发送initialize消息。由于此方法遵从普通的覆写规则所以通常应该在里面判断当前要初始化的是那个类。load与initialize方法都应该实现的精简一些这有助于保持应用程序的响应能力也能减少引入“依赖环”的几率。无法在编译期设定的全局常量可以放在initialize方法里初始化。 52.别忘了NSTimer会保留其目标对象 Foundation框架中有个类叫NSTimer开发者可以指定绝对的日期与时间以便到时执行任务,计时器要和“运行循环run loop”相关联运行循环到时候会触发任务。创建NSTimer时可以将其“预先安排”在当前的运行循环中也可以先创建好然后由开发者自己来调度。无论采用哪种方式只有把计时器放在运行环里它才能正常触发任务 创建计时器 _pollTimer [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:selector(pDoPoll) userInfo:nil repeats:YES];用此方法创建出来的计时器会在指定的间隔时间之后执行任务。也可以令其反复执行任务知道开发者稍后将其手动关闭为止。 计时器会保留其目标对象等到自身“失效”时再释放此对象。调用invalidate方法可令计时器失效执行完相关任务之后一次性的计时器也会失效。开发者若将计时器设置成重复执行模式那么必须自己调用invalidate方法才能令其停止。 由于计时器会保留其目标对象所以反复执行任务通常会导致应用程序出现保留环。 // NSTimer- (void)startPolling {_pollTimer [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:selector(pDoPoll) userInfo:nil repeats:YES];[self stopPolling]; } - (void)stopPolling {[_pollTimer invalidate];_pollTimer nil; } - (void)pDoPoll {NSLog(poll); } // 为啥不实现dealloc - (void)dealloc {[_pollTimer invalidate]; }这里为什么一直打印poll不是很理解 为什么没有调用dealloc方法 保留环 创建计时器的时候由于目标对象是self所以要保留此实例。然而因为计时器是用实例变量存放的所以实例也保留了计时器于是就产生了保留环。所以说调用stopPolling或者令系统将此实例回收只有这样才能打破保留环。 因为是类和这个类中的实例出现了保留环不管你外界怎么对这个类释放这个计时器始终都会保留这个类而这个类也会保留这个计时器互相引用保留导致他们的计数永远都不会降为0 如果从外界直接先调用stop方法代码没办法自己检测。 使用块的特点打破保留环 使用块和weak关键字合理的打破保留环块可以传递代码这一功能可以利用 这段代码将计时器所应执行的任务封装成“块”在调用计时器函数上把它作为userInfo参数传进去。该参数可用来存放“不透明值”即万能值只要计时器还有效就会一直保留着它。传入参数时要通过copy方法将block拷贝到“堆”上之前在blk提过copy方法把块变成了有引用计数的对象。 否则等到稍后要执行它的时候该块可能已经无效了。计时器现在的target是NSTimer类对象这是个单例因此计时器是否会保留它其实都无所谓。此处依然有保留环使用 方法和weak关键字打破它 [NSTimer scheduledTimerWithTimeInterval:2 repeats:YES block:^这段代码采用了一种很有效的写法他先定义了一个弱引用令其指向self然后使块捕获这个引用而不直接去捕获普通的self变量。也就是说self不会为计时器所保留。当块开始执行时立刻生成strong引用以保证实例在执行期间持续存活。 要点 NSTimer对象会保留其目标直到计时器本身失效为止调用invalidate方法可令计时器失效另外一次性的计时器在触发完成任务之后也会失效。反复执行任务的计时器很容易引人保留环如果这种计时器的目标对象又保留了计时器本身那肯定会导致保留环。这种环状保留关系可能是直接发生的也可能是通过对象图里的其他对象间接发生的。可以扩充NSTimer的功能**用“块” 来打破保留环。**不过除非NSTimer将来在公共接口里提供此功能否则必须创建分类将相关实现代码加入其中。 总结 小蓝书的最后一章刚开始看的不是很理解有些代码还是需要自己手动打一下才知道原理其中49.50 就是看着书写的理解的不是很完全GCD和block还是需要再次多加学习才能掌握。
http://www.w-s-a.com/news/914144/

相关文章:

  • 运动网站开发的需求分析南通市住房和城乡建设局网站
  • 佘山做网站谷歌云做网站
  • 免费发布信息网站大全666做p2p网站费用
  • 北京 网站建设咨询顾问公司网络公司有几家
  • 设计类网站如何用ps做网站首页
  • 品牌网站建设的关键事项设计网有哪些
  • 网站没收录徐州建设工程审图中心网站
  • 网站建设记账做什么科目erp系统有哪些软件
  • 泰拳图片做网站用哪里有做空包网站的
  • 查外链网站重庆做网站微信的公司
  • 有没有外包活的网站如何做网站快捷键的元素
  • 公司网站赏析网站制作2019趋势
  • 企业进行网站建设的方式有( )推广引流违法吗
  • 按营销型网站要求重做网站 费用点金网站建设
  • 深圳做网站互联网服务
  • 网站sem托管wordpress安装无法连接数据库
  • 深圳网站建设开发公司哪家好微信小程序商家入口
  • 江门站排名优化建立什么网站赚钱
  • 科普文章在那个网站做招聘网站代做
  • 监控设备东莞网站建设游戏网站域名
  • 对商家而言网站建设的好处网址导航怎么彻底删除
  • app设计网站模板企业展厅策划设计公司有哪些
  • wordpress销售主题手机网站关键词优化
  • 怎么查一个网站是什么程序做的三亚城乡建设局网站
  • 深圳分销网站设计公司做网站一般需要多久
  • 企业网站设计代码丹东seo排名公司
  • 企业网站建设定制开发服务网站建设说课ppt
  • 大连市城乡建设局网站网站免费网站入口
  • 做暧网站网站备案ps
  • 知名网站建设公司电话长子网站建设