发发发发发发 發表於 2013-4-24 09:08:07

【iOS入门】iOS开发整体结构(摘录,转发)

<div class="article-header-box">
<div class="article-header">
<div class="article-title-box">
<h1 class="title-article">IOS 整体框架类图值得收藏</h1>
</div>
<div class="article-info-box">
<div class="article-bar-top"><span class="article-type type-2 float-left">转载边缘998&nbsp;<span class="time">最后发布于2013-04-24 09:08:07&nbsp;<span class="read-count">阅读数 18871&nbsp;&nbsp;收藏</span></span></span></div>
<div class="operating">展开</div>
</div>
</div>
</div>
<div id="article_content" class="article_content clearfix">
<div id="content_views" class="htmledit_views">
<p>Cocoa框架是iOS应用程序的基础,了解Cocoa框架,对开发iOS应用有很大的帮助。</p>
<h2>1、Cocoa是什么?</h2>
<p>Cocoa是OS X和 iOS操作系统的程序的运行环境。</p>
<p>是什么因素使一个程序成为Cocoa程序呢?不是编程语言,因为在Cocoa开发中你可以使用各种语言;也不是开发工具,你可以在命令行上就可以创建Cocoa程序。Cocoa程序可以这么说,它是由一些对象组成,而这些对象的类最后都是继承于它们的根类 :NSObject。而且它们都是基于Objective-C运行环境的。</p>
<h3>1.1、Cocoa框架</h3>
<p>iOS中,Cocoa众多框架中最重要最基本的两个框架是:Foundation 和 UIKit。</p>
<p>Foundation 和界面无关,也可以说和界面无关的类基本是Foundation框架的,和界面相关的是UIKit框架。</p>
<p>这两个框架在系统中处于的位置如图:</p>
<p><img src="https://img-my.csdn.net/uploads/201210/17/1350459010_4309.jpg"></p>
<h3>1.2、Foundation框架</h3>
<p>好吧,那我们看看两个框架的类组织架构图,第一个先看Foundation的,三个图,包括了Foundation所以的类,图中灰色的是iOS不支持的,灰色部分是OS X系统的。</p>
<p><img src="https://img-my.csdn.net/uploads/201210/18/1350526881_2060.jpg">&nbsp;<img src="https://img-my.csdn.net/uploads/201210/18/1350526897_3494.jpg">&nbsp;</p>
<p><img src="https://img-my.csdn.net/uploads/201210/18/1350526913_6659.jpg"></p>
<p>将上图Foundation框架中的类进行逻辑分类如下:</p>
<ol>
<li>值对象</li>
<li>集合&nbsp;</li>
<li>操作系统服务 包括下面三个:文件系统和URL &nbsp;&nbsp;进程间通讯。&nbsp;这个范畴中的大部分类代表不同的系统端口、套接字、和名字服务器,对实现底层的IPC很有用。NSPipe代表一个BSD管道,即一种进程间的单向通讯通道。 &nbsp;&nbsp;线程和子任务。&nbsp;NSThread类使您可以创建多线程的程序,而各种锁(lock)类则为彼此竞争的线程在访问进程资源时提供各种控制机制。通过NSTask,您的程序可以分出 &nbsp; &nbsp; &nbsp;一个子进程来执行其它工作或进行进度监控。</li>
<li>通知</li>
<li>归档和序列化</li>
<li>表达式和条件判断</li>
<li>Objective-C语言服务</li>
</ol>
<p>&nbsp;</p>
<h3>1.3 UIKit框架</h3>
<div>应用程序可以通过三种方式使用UIKit创建界面</div>
<div><ol>
<li>&nbsp; 在用户界面工具(interface Buidler)从对象库里 拖拽窗口,视图或者其他的对象使用。</li>
<li>&nbsp; 用代码创建</li>
<li>&nbsp; 通过继承UIView类或间接继承UIView类实现自定义用户界面</li>
</ol></div>
<div>&nbsp;</div>
<div>框架类组织架构图:</div>
<div><img src="https://img-my.csdn.net/uploads/201210/18/1350528267_1570.jpg"></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<p>在图中可以看出,responder 类是图中最大分支的根类,UIResponder为处理响应事件和响应链 定义了界面和默认行为。当用户用手指滚动列表或者在虚拟键盘上输入时,UIKit就生成时间传送给UIResponder响应链,直到链中有对象处理这个事件。相应的核心对象,比如:UIApplication &nbsp;,UIWindow,UIView都直接或间接的从UIResponder继承。</p>
<h2>&nbsp;2、Cocoa对象</h2>
<h3>2.1 Objective-C是面向对象的语言</h3>
<p>Objective-C和Java C++一样,有封装,继承,多态,重用。但是它不像C++那样有重载操作法、模版和多继承,也没有Java的垃圾回收机制。</p>
<h3>2.2&nbsp;Objective-C的优点</h3>
<p>Objective-C语言有C++ Java等面向对象的特点,那是远远不能体现它的优点的。Objective-C的优点是它是动态的。动态能力有三种:</p>
<p>动态类-运行时确定类的对象</p>
<p>动态绑定-运行时确定要调用的方法</p>
<p>动态加载--运行时为程序加载新的模块</p>
<h3>2.3 动态能力相关的isa指针</h3>
<p>每个Objective-C对象都有一个隐藏的数据结构,这个数据结构是Objective-C对象的第一个成员变量,它就是isa指针。这个指针指向哪呢?它指向一个类对象(class object &nbsp;记住它是个对象,是占用内存空间的一个变量,这个对象在编译的时候编译器就生成了,专门来描述某个类的定义),这个类对象包含了Objective-C对象的一些信息(为了区分两个对象,我把前面提到的对象叫Objective-C对象),包括Objective-C对象的方法调度表,实现了什么协议等等。这个包含信息就是Objective-C动态能力的根源了。</p>
<p>那我们看看isa指针类型的数据结构是什么样的?如果抛开NSObject对象的其他的成员数据和变量,NSObject可以看成这样:</p>
<p>&nbsp;</p>
<div class="dp-highlighter bg_cpp">
<div class="bar">
<div class="tools">&nbsp;view plaincopy
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
</div>
</div>
<ol class="dp-cpp" start="1">
<li class="alt">@interface&nbsp;NSObject&nbsp;&lt;NSObject&gt;&nbsp;{&nbsp;&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;&nbsp;&nbsp;&nbsp;isa;&nbsp;&nbsp;</li>
<li class="alt">}&nbsp;&nbsp;&nbsp;</li>
</ol></div>
不考虑@interface关键字在编译时的作用,可以把NSObject更接近C语言结构表示为:
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="dp-highlighter bg_cpp">
<div class="bar">
<div class="tools">&nbsp;view plaincopy
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
</div>
</div>
<ol class="dp-cpp" start="1">
<li class="alt"><span class="keyword">struct&nbsp;NSObject{&nbsp;&nbsp;</span></li>
<li>&nbsp;  Class&nbsp;isa;&nbsp;&nbsp;</li>
<li class="alt">&nbsp;}&nbsp;&nbsp;</li>
</ol></div>
Class是用typedef 定义的
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="dp-highlighter bg_cpp">
<div class="bar">
<div class="tools">&nbsp;view plaincopy
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
</div>
</div>
<ol class="dp-cpp" start="1">
<li class="alt"><span class="keyword">typedef&nbsp;<span class="keyword">struct&nbsp;objc_class&nbsp;*Class;&nbsp;&nbsp;</span></span></li>
</ol></div>
那NSObject可以这么写了
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="dp-highlighter bg_cpp">
<div class="bar">
<div class="tools">&nbsp;view plaincopy
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
</div>
</div>
<ol class="dp-cpp" start="1">
<li class="alt"><span class="keyword">struct&nbsp;NSObject{&nbsp;&nbsp;</span></li>
<li>  objc_class&nbsp;*isa&nbsp;&nbsp;</li>
<li class="alt">}&nbsp;&nbsp;</li>
</ol></div>
那objc_class的结构是什么样的呢?大概是这样的:
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="dp-highlighter bg_cpp">
<div class="bar">
<div class="tools">&nbsp;view plaincopy
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
</div>
</div>
<ol class="dp-cpp" start="1">
<li class="alt"><span class="keyword">struct&nbsp;objc_class&nbsp;{&nbsp;&nbsp;</span></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;isa;&nbsp;&nbsp;</li>
<li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;super_class;&nbsp;&nbsp;</li>
<li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">const&nbsp;<span class="datatypes">char&nbsp;*name;&nbsp;&nbsp;</span></span></li>
<li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="datatypes">long&nbsp;version;&nbsp;&nbsp;</span></li>
<li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="datatypes">long&nbsp;info;&nbsp;&nbsp;</span></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li>
<li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="datatypes">long&nbsp;instance_size;&nbsp;&nbsp;</span></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">struct&nbsp;objc_ivar_list&nbsp;*ivars;&nbsp;&nbsp;</span></li>
<li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">struct&nbsp;objc_method_list&nbsp;**methodLists;&nbsp;&nbsp;&nbsp;</span></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li>
<li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">struct&nbsp;objc_cache&nbsp;*cache;&nbsp;&nbsp;</span></li>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">struct&nbsp;objc_protocol_list&nbsp;*protocols;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
<li class="alt">&nbsp;}&nbsp;&nbsp;</li>
</ol></div>
这里会看到,在这个结构体里还有一个isa指针,又是一重指向,是不是有种到了盗梦空间的感觉。不用紧张,take easy,不会有那么多层次的,这里的isa指针指向的是元类对象(metaclass object),带有元字,证明快到头了。那元对象有啥用呢?它用来存储的关于类的版本,名字,类方法等信息。所有的元类对象(metaclass object)都指向 NSObject的元类对象,到头还是NSObject。一共三次:类对象-&gt;元类对象-&gt;NSObject元类对象。
<p>&nbsp;</p>
<p>&nbsp; &nbsp;为了得到整个类组织架构的信息,objc_class结构里定义了第二个成员变量Class super_class,它指向父类的类对象。说了这么多,可能关系缕不清楚,有道是一张图胜过千言万语</p>
<p><img src="https://img-my.csdn.net/uploads/201210/21/1350831500_2327.jpg"></p>
<p>图中可以看出,D3继承D2,D2继承D1,D1最终继承NSObject。下图从D3的一个对象开始,排列出D3 D2 D1 NSObject 类对象,元类对象等关系。</p>
<p><img src="https://img-my.csdn.net/uploads/201210/21/1350831599_3230.png"></p>
<p>图中的箭头都是指针的指向。</p>
<h3>2.4 根类 NSObject</h3>
<p>NSObject是大部分Objective-C类的根类,它没有父类。其它类继承NSObject,访问Objective-C运行时系统的基本接口,这样其他类的实例可以获得运行时的能力。</p>
<p><img src="https://img-my.csdn.net/uploads/201210/22/1350871031_1713.jpg"></p>
<h4>2.4.1 根类和根类协议</h4>
<p>NSObject不但是个类名,NSObject也是个协议的名称,参考NSObject协议&nbsp;, NSObject协议指定了根类必须实现的接口。</p>
<p>&nbsp;</p>
<h4>2.4.2 根类的主要方法:</h4>
<h5></h5>
<ul>
<li>&nbsp; &nbsp; 分配、初始化、和复制:</li>
</ul>
alloc和allocWithZone:方法用于从某内存区域中分配一个对象内存,并使对象指向其运行时的类定义。<br>init方法是对象初始化。<br>new是一个将简单的内存分配和初始化结合起来的方法。<br>copy和copyWithZone:
<p>&nbsp;</p>
<p>&nbsp;</p>
<h5></h5>
<ul>
<li>对象的保持和清理:</li>

</ul>

retain方法增加对象的保持次数。<br>release方法减少对象的保持次数。<br>autorelease方法也是减少对象的保持次数,但是以推迟的方式。<br>retainCount方法返回对当前的保持次数。<br>dealloc方法由需要释放对象的实例变量以及释放动态分配的内存的类实现。<br>
<h5></h5>
<ul>
<li>内省和比较</li>

</ul>
<p>&nbsp;</p>
<p>NSObjec有很多方法可以查询对象的运行时信息。这些内省方法有助于找出对象在类层次中的位置,确定对象是否实现特定的方法,以及测试对象是否遵循某种协议。下面是部分方法&nbsp;<br>superclass和class方法(实现为类和实例方法)分别以Class对象的形式返回接收者的父类和类。<br>您可以通过isKindOfClass:和isMemberOfClass:方法来确定对象属于哪个类。后者用于测试接收者是否为指定类的实例。isSubclassOfClass:类方法则用于测试类的继承性。<br>respondsToSelector:方法用于测试接收者是否实现由选择器参数标识的方法。instancesRespondToSelector:类方法则用于测试给定类的实例是否实现指定的方法。<br>conformsToProtocol:方法用于测试接收者(对象或类)是否遵循给定的协议。<br>isEqual:和hash方法用于对象的比较。<br>description方法允许对象返回一个内容描述字符串;这个方法的输出经常用于调试(“print object”命令),以及在格式化字符串中和“%@”指示符一起表示对象。</p>
<h5></h5>
<ul>
<li>对象的编码和解码</li>

</ul>
<p>&nbsp;</p>
<p>下面的方法和对象的编解码(作为归档过程的一部分)有关:<br>encodeWithCoder:和initWithCoder:是NSCoding协议仅有的方法。前者使对象可以对其实例变量进行编码,后者则使对象可以根据解码过的实例变量对自身进行初始化。<br>NSObject类中声明了一些于对象编码有关的方法:classForCoder:、replacementObjectForCoder:、和awakeAfterUsingCoder:。</p>
<p>&nbsp;</p>
<h5></h5>
<ul>
<li>消息的转发</li>

</ul>
<p>&nbsp;</p>
<p>&nbsp;forwardInvocation:允许一个对象将消息转发给另一个对象。</p>
<h5></h5>
<ul>
<li>消息的派发&nbsp;</li>

</ul>
<p>&nbsp;</p>
<p>在performSelector开头的一些方法允许你延迟后派发指定消息,而且可以将消息(同步或异步的消息)从辅助线程派发到主线程。</p>
<h3>2.5 Cocoa对象生命周期</h3>
<p>对象的四种内存管理方式,如下图所示</p>
<p>&nbsp;</p>
<ul>
<li>&nbsp;对象的生命周期—简化视图</li>

</ul>
<p>&nbsp;</p>
<p><img src="https://img-my.csdn.net/uploads/201210/22/1350871223_8473.gif"></p>
<p>&nbsp;</p>
<ul>
<li>保持接收到的对象</li>

</ul>
<p>&nbsp;</p>
<p><img src="https://img-my.csdn.net/uploads/201210/22/1350871326_3857.gif"></p>
<p>&nbsp;</p>
<ul>
<li>拷贝接收到的对象</li>

</ul>
<p>&nbsp;</p>
<p><img src="https://img-my.csdn.net/uploads/201210/22/1350871361_2570.gif"></p>
<p>&nbsp;</p>
<ul>
<li>自动释放池</li>

</ul>
<p>&nbsp;</p>
<p><img src="https://img-my.csdn.net/uploads/201210/22/1350871395_7054.gif"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>

</div>

</div><br><br>
来源:https://www.cnblogs.com/mamamia/p/12178940.html
頁: [1]
查看完整版本: 【iOS入门】iOS开发整体结构(摘录,转发)