iOS框架介绍

Cocoa是苹果的面向对象开发框架,用来生成Mac OS X 的应用程序主要开发语言是Objective-C 。Cocoa框架是iOS应用程序的基础,了解Cocoa 框架对iOS开发有很大的帮助。

什么因素决定了一个程序是Cocoa程序呢?no 编程语言,因为在Cocoa中你可以使用各种语言,no 开发工具,因为你可以在命令行上创建Cocoa程序。Cocoa 程序由一系列对象组成,而这些对象的类最终都继承于他们的根类:NSObject ,其均是机遇Objective -C 运行环境的。


在iOS中,Foundation和UIkit是Cocoa众多框架中最重要的两个框架,和界面相关的是 UIKit,和节目无关的是 Foundation.

这两个框架在系统中处于的位置如图:

1394I625LL20-14K5.jpg

现在我们了解下两个框架的类组织结构图。

下图为Foundation的组织架构图,其3张图大概包括了Foundation中所有的类。图中灰色的是iOS不支持的,是OS X 系统的。

1394I625Q3C0-22b4.jpg




将上图Foundation框架中的类进行逻辑分类如下:

值对象

集合

操作系统服务,包括文件系统,URL ,进程间通讯。这些范畴中的大部分类代表不同系统端口,套接字和名字服务器。对实现底层的IPC 很有用。NSPipe代表一个BSD 管道,即一种进程间的单向通行通道。

线程和子任务。NSThread类使您可以创建多线程的程序。而各种锁(lock)类则为彼此竞争的线程在访问进程资源时提供各种控制机制。通过NSTask,您的程序可以分出一个子进程来执行其它工作或者进行进程监控。


下图为UIkit的组织框架图:

图中可以看出,responder类是图中最大分支的根类,UIResponde为处理响应事件和响应链定义了界面和默认行为。当用户用手指滚动列表或者在虚拟键盘上输入时,UIKit就生成时间传送给UIResponder响应链,直到链中有对象处理这个事件。相应的核心对象,比如:UIApplication,UIWindow,UIView都可以直接或者间接的从UIResponder继承。


Objective - C 是面向对象的语言

Objective - C和Java C++一样,有封装,继承,多态和重用。

Objective - C语言有C++ Java等面向对象的特点,那是远远不能体现它的优点的,Objective -C 的优点是它是动态的。

动态能力有三种:

动态类-运行时确定类的对象

动态绑定 - 运行时确定要调用的方法

动态加载-运行时为程序加载新的模块

每个Objective - C对象都有一个隐藏的数据结构,这个数据结构是Objective-C 对象的第一个成员变量,它就是isa指针。这个指针指向一个类对象(Class object ,记住它是一个对象,是占用内存空间的一个变量,这个对象在编译的时候编译器就生成了,专门来描述某个类的定义),这个类对象包含了Objective -C 对象的一些信息(为了区分两个对象,把前面提到的叫Objective -C对象),包括Objective -C 对象的方法调度表,实现了什么协议等等。这个包含信息就是Objective-C动态能力的根源了。

现在我们看看isa指针类型的数据结构是什么样子?如果抛开NSObject对象的其他的成员数据和变量,NSObject可以看成这样:

  1. @interface NSObject <NSObject> {  
  2.       Class    isa;  
  3. 不考虑@interface关键字在编译时的作用,可以把NSObject更接近C语言结构表示为:
    1. struct  NSObject{  
    2.   Class isa;  
    3.  } 
    4. Class是用typedef 定义的,typedef   struct  objc_class *Class;那NSObject可以这么写了
      1. struct  NSObject{  
      2. objc_class *isa  
      3. }  
      那objc_class的结构是什么样的呢?大概是这样的:
      1. struct  objc_class {  
      2.      Class isa;  
      3.        
      4.      Class super_class;  
      5.        
      6.        const   char  *name;  
      7.        
      8.        long  version;  
      9.        long  info;  
      10.        
      11.        long  instance_size;  
      12.        struct  objc_ivar_list *ivars;  
      13.        struct  objc_method_list **methodLists;   
      14.        
      15.        struct  objc_cache *cache;  
      16.        struct  objc_protocol_list *protocols;     
      17.  }  

      这里会看到, 在这个结构体里还有一个isa指针,又是一重指向,是不是有种到了盗梦空间的感觉。不用紧张,take easy,不会有那么多层次的,这里的isa指针指向的是元类对象(metaclass object),带有元字,证明快到头了。那元对象有啥用呢?它用来存储的关于类的版本,名字,类方法等信息。所有的元类对象(metaclass object)都指向 NSObject的元类对象,到头还是NSObject。一共三次:类对象->元类对象->NSObject元类对象。

         为了得到整个类组织架构的信息,objc_class结构里定义了第二个成员变量Class super_class,它指向父类的类对象。说了这么多,可能关系缕不清楚,有道是一图胜过千言万语

      图中可以看出,D3继承D2,D2继承D1,D1最终继承NSObject。下图从D3的一个对象开始,排列出D3 D2 D1 NSObject 类对象,元类对象等关系。


      图中的箭头都是指针的指向。

      NSObject是大部分Objective-C类的根类,它没有父类。其它类继承NSObject,访问Objective-C运行时系统的基本接口,这样其他类的实例可以获得运行时的能力。 

NSObject不但是个类名,NSObject也是个协议的名称,  参考NSObject协议  , NSObject协议指定了根类必须实现的接口。 

  • 分配、初始化、和复制:

alloc和allocWithZone:方法用于从某内存区域中分配一个对象内存,并使对象指向其运行时的类定义。 
init方法是对象初始化。 
new是一个将简单的内存分配和初始化结合起来的方法。 
copy和copyWithZone:

  • 对象的保持和清理:

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

  • 内省和比较

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

  • 对象的编码和解码
  • 下面的方法和对象的编解码(作为归档过程的一部分)有关:  

    encodeWithCoder:和initWithCoder:是NSCoding协议仅有的方法。前者使对象可以对其实例变量进行编码,后者则使对象可以根据解码过的 实例变量对自身进行初始化。  
    NSObject类中声明了一些于对象编码有关的方法:classForCoder:、replacementObjectForCoder:、和awakeAfterUsingCoder:。  

    • 消息的转发

       forwardInvocation:允许一个对象将消息转发给另一个对象。  

    • 消息的派发 
    • 在performSelector开头的一些方法允许你延迟后派发指定消息,而且可以将消息(同步或异步的消息)从辅助线程派发到主线程。  

      对象的四种内存管理方式,如下图所示

      •  对象的生命周期—简化视图


      • 保持接收到的对象


      • 拷贝接收到的对象


      • 自动释放池


      参考:

      1、http://algorithm.com.au/downloads/talks/objective-c-internals/objective-c-internals.pdf 

      2、http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/Introduction/Introduction.html

      3、http://www.cnblogs.com/csutanyu/archive/2011/12/12/Objective-C_memory_layout.html

      转:  http://blog.csdn.net/fengsh998/article/details/8842885





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值