参考书籍:《精通objective-c》【美】 keith lee
<a href="#%e7%b2%be%e9%80%9aobjective-c%e7%b1%bb%e6%8e%a5%e5%8f%a3%e5%8d%8f%e8%ae%ae%e4%b8%8e%e6%89%a9%e5%b1%95">精通objective-c类接口协议与扩展</a>
<a href="#%e7%9b%ae%e5%bd%95">目录</a>
<a href="#%e7%b1%bb">类</a>
<a href="#%e7%b1%bb%e7%9a%84%e6%8e%a5%e5%8f%a3">类的接口</a>
<a href="#%e7%b1%bb%e7%9a%84%e5%ae%9e%e7%8e%b0">类的实现</a>
<a href="#%e5%ae%9e%e4%be%8b%e5%8f%98%e9%87%8f">实例变量</a>
<a href="#%e5%b1%9e%e6%80%a7">属性</a>
<a href="#%e6%96%b9%e6%b3%95">方法</a>
<a href="#%e5%8d%8f%e8%ae%ae">协议</a>
<a href="#%e5%88%86%e7%b1%bb">分类</a>
<a href="#%e6%89%a9%e5%b1%95">扩展</a>
创建一个类名为atom,继承于nsobject的类。atom类由两个文件组成,atom.h和atom.m,分别为类的接口和实现。
atom类的接口是在头文件atom.h中设置的,用于声明类的属性和方法。
实现atom类的代码在atom.m中,用于定义类的实例变量,属性和方法。
完成类的实现后,就可以在其他类中使用它了。
实例变量值为类声明的变量,它们在相应类实例(即对象)的声明周期中存在并拥有值。当对象被创建时,系统会为实例变量分配内存,当对象被创建时,系统会为实例变量分配内存,当对象被释放时系统也会释放变量占用的内存。实例变量拥有与对象对应的作用范围与命名空间。
实例变量可以类的接口或实现部分中声明,不过在类的接口中声明会违法oop(面向对象程序设计)的封装原则,因此,最好在类的实现部分中声明实例变量。
尽管实例变量可以方便、直接地访问对象的状态,但是会暴露类的内部,违反opp的封装原则,因此只应在必要时声明实例变量,更好的方式是使用属性。属性与实例变量的区别是,属性无法直接访问对象的内部状态,但提供了访问这类数据的方便机制(getter/setter方法)。
属性的常用特性:
类别
特性
描述
原子性
nonatomic
使用该特性可以在多线程并发的情况中,将访问器设置为非原子性,因而能够提供不同的结果。否则,访问器会拥有原子性,赋值和返回结果永远都会同步
设置器语义
assign
默认设置,属性的设置器方法执行简单的赋值操作
retain
setter方法先release旧值,再retain新值,拷贝时为指针拷贝
copy
setter方法先release旧值,再复制新值,拷贝时为值拷贝
strong
属性使用arc内存管理功能时,等于retain特性
weak
属性使用arc内存管理功能时,类似assign特性
可读写性
readwrite
默认设置,属性可读写
readonly
只读属性
方法名称
getter=gettername
将getter方法重命名为新读取器的名称
setter=settername
将setter方法重命名为新读取器的名称
属性定义有多种方法:显式定义,通过关键字补全和自动补全。
显式定义:
通过关键字补全:
自动补全:
编译器会对没有使用关键字(如@synthesize)、不是动态生成的或没有用户编写getter和setter方法的属性补全已声明的属性和相应的实例变量。
访问属性可以用访问器方法和点语法,编译器会根据标准命名习惯自动补全访问器方法,getter方法拥有与属性相同的名称,setter方法其名称以set开头,后跟首字母大写的属性名。
方法声明由方法类型,返回值类型和一个或多个方法代码段(包括名称,参数,参数类型)构成。
方法的类型标识符表明了该方法是类方法还是实例方法。类方法由+(加号)表示,这表示该方法拥有类的作用范围,这意味着它使用类级的操作并且无法访问类的实例变量(除非这些变量被当做参数传给它)。实例方法由-(减号)表示,这表明该方法拥有对象的作用范围,这意味着它使用实例级的操作,并且可以直接访问对象及其父对象的实例变量(根据实例变量上设定的访问控制)。
返回值类型表明了方法返回变量的类型。返回值的类型在方法类型后面的圆括号中设置。
方法代码段由名称,参数,参数类型组成,如<code>withprotons:(nsuinteger)protons</code>中withprotons是名称,nsuinteger是参数类型,protons是参数。
对象(发送器)通过发送消息与其他对象(接收器)进行交互,从而调用指定的方法。以下为调用方法的例子:
使用协议声明的方法和属性可以由任何类实现。协议使objective-c支持多重继承的概念。下面创建一个名为writer遵循nsobject协议的协议。
在atom.h中接收协议
在atom.m中实现协议
使用分类可以在不进行子类化的情况下,为已经存在的类增加功能。分类通常用于:1.拓展其他人定义的类(即使无法访问源码);2.代替子类;3.将新类的实现代码分发给多个源文件。
创建一个拓展atom的分类nuclear,并声明定义一个方法。
nuclear接口代码:
nuclear实现代码:
然后atom类型对象就可以直接调用该方法。
可以将扩展视为一种匿名(即未命名的)分类。在扩展中声明的方法必须在相应类的主@implementation块中实现,无法在分类中实现。拓展与分类的区别是它能够声明实例变量和属性。以下是在atom.m中实现扩展。