知乎:
Cocoa 是一套框架和运行时支持,简单来说就是API应用程序接口。与你耳熟能详的MFC、dotNet、C标准库评级。
Cocoa touch 是cocoa在iOS上的实现,也是iOS上唯一的框架,开发iOS App,简单来说,OC是开发语言,Cocoa touch 是框架。
建议23:编写代码要遵守Cocoa API 约定
1.在API 命名上,清楚是第一原则,而非简洁,切记要避免模棱两可的命名。
2.在对函数或方法命名上,务必要使用“动词”,凸显函数和方法的“动性”。
3.在API名称上不要使用缩写,除非是众所周知的缩写(如HTML或TIFF)。
4.在对类名和与类相关联的符号命名(如函数和typedef定义的类型)时,务必要使用前缀。
建议24:洞悉实例变量
在OC中实例变量是指对象、结构、以及作为类定义一部分的其他数据的类型声明。
简书:http://www.jianshu.com/p/ed41b99c06de :
一.成员变量 : 写在类声明的大括号中的变量叫成员变量 (也叫属性/实例变量)
成员变量存储在堆中(当前对象对应的堆得存储空间中) 不会被系统自动释放 只能有程序员手动释放
二.局部变量 :写在代码块或函数中的变量为局部变量
局部变量的作用域 : 从定义的那一行开始,一直到遇到大括号或return(也就是这个变量所在的代码块或函数结束时)
局部变量可以先定义后初始化,也可以在定义的同时就初始化
局部变量存储在栈里面 系统会自动释放
三.全局变量 : 写在函数外或大括号外的变量就是全局变量
全局变量的作用域 : 从定义哪行开始 到文件末尾
全局变量可以向定义再初始化,也可以定义的同时初始化
全局变量存储在静态区中 程序启动时就会分配存储空间 直到程序结束才会释放
为了使对象有能力隐藏它的数据,编译器限制了实例变量的访问范围,也就是限制了程序对它们的可见性。可见范围分为4个等级,对应的编译指令如下:
@private 变量只限于声明它的类访问
@protected 变量可以被声明它的类及继承该类的类使用。所有没有明确指定访问范围的变量默认为 @protected
@public 变量可以在任何位置访问
@package 类似于Java 中包的概念,可以把变量的访问范围控制在一个范围内,如一个framework
只加入一些绝对有必要的实例变量,否则容易造成大的开销。在可能的情况下,尽量从现有的实例变量中计算出一个关键值(?),而不是增加新的实例变量。
永远不要将变量设置为@public ,因为这违反了封装的原则。
建议25:透彻了解属性的里里外外
默认情况下,读写属性是由实例变量所支持,将再次由编辑器自动合成。除非另行指定,否则合成的实例变量和属性的差别就是多了一个下划线。
1.可以自定义合成实例变量名称。默认情况下,可写属性使用的实例变量被称为_propertyName。如果想要使用的实例变量不同名,需要在实现中指示编译器合成的变量,使用语法如下:
@synthesize propertyName(属性名字) = instanceVariableName(实例变量名字);
这种情况下,虽然该属性仍将被称为propertyName,并且可以通过propertyName对应的存取方法或点语法访问该属性,但是它受一个名为instanceVariableName的实例变量所支持。
2.无需属性也可定义实例变量。在类接口或实现的顶部将它们添加到括号内(全局变量)。
访问器方法(百度百科):声明类的时候,通常将成员变量声明为private,以防止直接访问成员变量而引起的恶意操作。但是,这并不是不允许访问,而是可以通过公共接口间接访问。而属性对应的公共方法称为访问器方法。访问器根据功能区分为读访问器方法(getter)和写访问器方法(setter)。
3.属性有静态动态之分 。关键字 @dynamic,用于定义动态属性。属性动态性是相对于@synthesis来说的,不是有编译器自动生成setter或getter,而是在运行时动态添加的setter和getter。属性采用动态性,与采用静态性相比,可以简化代码的编写,便于代码的管理。?
4.利用类扩展可实现对属性的“篡改”。????
建议26:存取方法是良好的类接口必要组成部分
存取方法(存取器)负责获取或设置实例变量的值,提供对象属性的访问通道,并强制对对象实例数据的封装。
建议27:明晓类公共领域的方法都是虚方法
虚方法(函数)是实现“多态”的基础,其实现机理:运行系统将根据对象的类型,自动选择适当的具体实现运行。
在OC 中,所有的方法都是虚方法。
建议28:初始化还是解码取决于是否支持归档和解档
类的对象支持归档和解档,该类必须遵循NSCoding协议;必须实现对对象进行编码(encodeWithCoder:)和解码(initWithCoder:)的方法。
建议29:利用键-值机制访问类的私有成员变量和方法
键-值 这个术语指的是将属性名称作为键,并通过这个键取得相应的值。
1.键-值 编码(Key-Value Coding)
该机制简称KVC,通过实现名为NSKeyValueCoding 的非正式协议,使开发者可以通过键直接设置或获取对象的属性,而不需要调用对象的存取方法(Cocoa 为该协议提供了默认的实现)。键通常和被访问的对象中的实例变量或存取方法的名称像对应。
KVC 主要通过isa-swizzling 技术来实现其内部查找定位的,isa-swizzling 就是类型混合指针机制。
2.键-值 观察 (Key-Value Observing)
该机制简称KVO,通过实现名为NSKeyValueObserving 的非正式协议,其作用是使对象可以将自己注册为其他对象的观察者。当被观察对象的属性之一发生改变时,会直接通知相应的观察者。Cocoa 为遵循KVO 对象的每个属性,都实现了自动观察者通知机制。
我们不仅可以观察普通对象,还可以观察数组或集合类对象。
KVO 设计基于设计模式中的“观察者模式”,其基本思想就是:一个目标对象管理所有依赖于它的观察者对象,并在它自身的状态改变时主动通知观察者对象。这个主动通知通常是通过调用各观察者对象所提供的接口方法来实现的。观察者模式较完美地将目标对象与观察者对象解耦。
在OC中,类的成员变量或方法是没有绝对私有的,可以借助“编译运行时”机制,即“瞎子摸黑”机制来实现对它们的访问。
建议30:浅复制适宜指针而深复制适宜数据
浅复制,是将原始对象的指针值复制到副本中,从而达到原始对象和副本共享引用数据的目的; 深复制,是复制指针所引用的数据,并将其赋给副本的实例变量。
建议31:明智而审慎地使用NSCopying
不明觉厉
建议32:使用协议来实现匿名对象的提供
采用协议,可灵活实现。实现抽象不应该依赖于细节,而细节应该依赖于抽象,降低“声明”和“实现”的耦合度。