IOS读书笔记第二篇:52个有效方法

第37条:理解“块”这一概念
块可以实现闭包。“扩展extension”加入GCC编译器。Clang 是开发Mac OSX及iOS程序所用。
块与函数类似。只不过是直接定义在另一个函数里的,符号^后面跟{}里面是块的实现代码。
块其实就是一个值。块类型的语法与函数指针近似。
与int、float或Objective-C对象一样,也可以把块赋给变量,然后像使用其他变量那样使用它。
返回类型,块名称。parameters:参数名称
return_type (^block_name)(parameters)


D535FDE1-E758-47DC-A9BC-C6FB54CDD096.png

int add = addBlock(2,5);

块的强大之处:在声明它的范围里,所有变量都可以为其所捕获。那个范围里的全部变量,在快里依然可用。
14FDD41D-CAE2-498A-A72F-ADBCE3547CB7.png

默认,被块所捕获的变量,是不可以在块里修改的。若改就报错。如果声明变量的时候可以加上_block修饰符,就可以在块内修改。
块如果所捕获的遍历是对象类型就会自动保留它。块本身可视为对象。有引用计数。当最后一个指向块的引用移走之后。块就回收了。
在存放块对象的内存区域中,首个变量是指向Class对象的指针,该指针叫做isa。其余内存里含有块对象正常运转所需的各种信息。
第36条:不要使用retainCount
OC中通过引用计数来管理内存。对象有计数器,当对象的计数变为0之后,对象就被系统所回收和摧毁了。
NSObject有retainCount,之所以没有用的原因是:它所返回的保留计数只是某个给定时间点上的值。该方法并未考虑到系统会稍后把自动释放池清空。因而不会将后续的释放操作从返回值里减去,所以此值不准。
while ([object retainCount]) {
[object release];

}
retainCount 可能永远不返回0,
第35条:用"僵尸对象"调试内存管理问题
僵尸对象是一个调试功能。运行期系统会把所有已经回收的实例转化为特殊的“僵尸对象”,而不会真正的回收他们。
第34条:合理运用自动释放池,可降低应用程序的内存峰值。第33条:以弱引用避免保留环。
第28条:通过协议提供匿名函数。用协议把自己所写的API之中的实现细节隐藏起来。将返回的对象设计为遵从此协议的纯id类型。在字典中,键的标准内存管理语义是“设置时拷贝”,而值的语义则是“设置时保留”。设置键值对

  • (void)setobject:(id)object forKey:(id)key. 键的那个参数其类型为id,作为参数值的对象。
    这个key参数可以视为匿名对象。字典不关心key对象所属的具体类。
    处理数据库连接的程序库可以用这个思路。第27条:使用"class-continuation分类"隐藏实现细节。
    通过“class-continuation分类”向类中新增实例变量。,如果某属性在主接口中声明为“只读”,而类的内部又要用设置方法修改此属性,那么就在“class-continuation分类”中将其扩展为“可读写”。
    把私有方法的原型声明在“class-continuation分类”里面。
    若想使类所遵循的协议不为人所知,则可于“class-continuation分类”中声明。
    第26条:勿在分类中声明属性。
    所有属性都定义在主接口里。分类是扩展类的功能,而非封装数据。不过只读属性可以在分类中使用。获取方法不访问数据,属性不需要由实例变量来实现。

    这样实现也不好。所以还是遵循上面的规则。
    45E0A9EF-7BD9-45BF-B55B-6442210289A5 (1).png
    第25条:总是为第三方类的分类名称加前缀。
    分类机制通常用于向无源码的既有类中新增功能。分类中的方法是直接添加在类里面的,是咋子运行期系统加载分类时完成的。运行期系统会把分类中所实现的每个方法都加入类的方法列表中,会覆盖类中的方法。多次覆盖以最后一个分类为准。以命名空间来区别各个分类的名称与其中所定义的方法。
    给名称加上你专用的前缀,给其中的方法名加上你专用的前缀。
    第24条:将类的实现代码分散到便于管理的数个分类之中。
    用“分类”机制,将类代码按逻辑划入几个分区中。类的基本要素(属性与初始化方法等)都声明在“主实现”里。
    B6142017-3D0E-4E64-B824-8E433D087EA1.png
    这样将类方法打散到分类中:便于调试。将应该视为“私有”的方法归入名叫Private分类中,以隐藏细节。
    第23条:通过委托与数据源协议进行对象间通信。
    委托模式:定义一套接口,某对象若想接受另一个对象的委托,则需遵循此接口。以便成为其委托对象,而这“另一个对象”则可以给其委托对象回传一些信息,也可以在发送相关事件时通知委托对象。

    对象把应对某个行为的责任委托给另外一个类。令某类经由该接口获取其所需的数据。
    在向类提供数据:数据源模式。信息从数据源流向类。而在常规委托模式中,信息则从类流向受委托者。
    第22条:理解NSCopying。
    使用对象时经常需要拷贝它。OC中通过copy方法完成。令自己的类支持拷贝。就要实现NSCopying协议。

  • (id)copyWithZone: (NSZone *)zone 内存分成不同的“区”(zone),对象会创建在某个区里面,每个程序只有一个区:“默认区”。
    copy方法由NSObject实现,该方法只是以“默认区”为参数来调用。“copywithzone”。
    若想使某个类支持拷贝功能,只需声明该类遵从NSCopying协议。自己写的对象具有拷贝功能,需事先NSCopying协议。如果自定义对象分为可变版本与不可变版本,同时实现NSCopying与NSMutableCopying协议。复制对象时决定采用浅拷贝还是森1拷贝,尽量执行浅拷贝。

    如果对象需要深拷贝,新增一个专门执行深拷贝的方法。
    4A876549-D0AA-4EE6-BDA9-B72F8EB2A69B.png

你可能感兴趣的:(IOS读书笔记第二篇:52个有效方法)