参考书籍:《精通objective-c》【美】 keith lee
<a href="#%e7%b2%be%e9%80%9aobjective-c%e5%af%b9%e8%b1%a1%e5%92%8c%e6%b6%88%e6%81%af%e4%bc%a0%e9%80%92">精通objective-c对象和消息传递</a>
<a href="#%e7%9b%ae%e5%bd%95">目录</a>
<a href="#%e5%af%b9%e8%b1%a1">对象</a>
<a href="#%e5%88%9b%e5%bb%ba%e5%af%b9%e8%b1%a1">创建对象</a>
<a href="#%e5%88%9d%e5%a7%8b%e5%8c%96%e5%af%b9%e8%b1%a1">初始化对象</a>
<a href="#%e9%87%8d%e6%9e%84atom%e7%b1%bb%e5%b9%b6%e5%88%9b%e5%bb%ba%e5%ad%90%e7%b1%bb">重构atom类并创建子类</a>
<a href="#%e5%b7%a5%e5%8e%82%e6%96%b9%e6%b3%95">工厂方法</a>
<a href="#%e6%b6%88%e6%81%af%e4%bc%a0%e9%80%92">消息传递</a>
<a href="#%e5%8f%91%e9%80%81%e6%b6%88%e6%81%af">发送消息</a>
<a href="#%e6%b6%88%e6%81%af%e8%bd%ac%e5%8f%91">消息转发</a>
<a href="#%e9%99%84%e5%bd%95%e5%89%8d%e4%b8%80%e7%ab%a0%e8%8a%82%e5%88%9b%e5%bb%ba%e7%9a%84atom%e7%b1%bb">附录前一章节创建的atom类</a>
nsobject类中用于创建类实例(即对象)的方法
通过alloc方法,可以创建对象,下面以创建一个atom对象为例
alloc方法为对象分配了内存,并将它的实例变量设置为0,但是alloc方法既没有将该对象的实例变量初始化为适当的值,也没有为这个对象准备其他必须的对象和资源。因此自定义的类还应该实现完成初始化的过程的方法。
nsobject类中用于初始化对象的方法:
下面以atom类的init方法为例:
编译器自动补全属性时,创建的是一个作用范围为@private的支持实例变量,无法被该类的子类访问。可以重构该类,将这个变量的作用范围设置为@protected。
创建一个atom类的子类hydrogen,并使用新的可以接受参数的初始化方法。
hydrogen.h
hydrogen.m
工厂方法是指用于创建和初始化类的便捷方法
在hydrogen.h中声明
在hydrogen.m实现
之后我们就可以用两种不同的方法来完成对象的初始化了
消息传递是oop中的用于调用对象中方法的机制。接收消息的对象(接收器)会在运行时决定调用其实例的哪个方法。实例方法可以访问对象的实例变量和实例方法。
向对象发送消息的格式:
同时objective-c还为类方法提供了语言级的支持:
之前的<code>[hydrogen hydrogenwithneutrons:2]</code>就是向hydrogen类发送消息。
在运行时,接收器都会通过解释消息,确定需要调用哪个方法。objective-c提供了消息转发机制,当对象收到与其方法集不匹配的消息时,通过消息转发机制可以使对象能够在收到无法识别的信息时执行各种逻辑,如将消息发送给能够作出回应的其他接收器或是既不处理也不使程序抛出运行时错误,默默吞下消息。
objective-c为nsobject类的子类提供了两类消息转发选项。
快速转发:
标准(完整)转发:
下面来为hydrogen类添加快速转发机制。
首先需要创建一个辅助类hydrogenhelper,该类负责处理一个名为factoid的hydrogen类无法处理的方法。
hydrogenhelper.h
hydrogenhelper.m
再更新hydrogen类的代码
为了使hydrogen类能够接收factoid方法,还需再添加一个分类,在其中声明factoid方法(不需要实现)
atom+helper.h(由于不需要实现方法可以把自动创建出来的atom+helper.m删掉)
最后就可以通过消息转发功能,向hydrogen对象发送factoid方法了
atom.h
atom.m