iOS Cocoa框架介绍

Cocoa框架是iOS应用程序的基础,了解Cocoa框架,对开发iOS应用有很大的帮助。

1、Cocoa是什么?

Cocoa是OS X和 iOS操作系统的程序的运行环境。
是什么因素使一个程序成为Cocoa程序呢?不是编程语言,因为在Cocoa开发中你可以使用各种语言;也不是开发工具,你可以在命令行上就可以创建Cocoa程序。Cocoa程序可以这么说,它是由一些对象组成,而这些对象的类最后都是继承于它们的根类 :NSObject。而且它们都是基于Objective-C运行环境的。

1.1、Cocoa框架

iOS中,Cocoa众多框架中最重要最基本的两个框架是:Foundation 和 UIKit。
Foundation 和界面无关,也可以说和界面无关的类基本是Foundation框架的,和界面相关的是UIKit框架。
这两个框架在系统中处于的位置如图:

Cocoa 框架结构

1.2、Foundation框架

好吧,那我们看看两个框架的类组织架构图,第一个先看Foundation的,三个图,包括了Foundation所以的类,图中灰色的是iOS不支持的,灰色部分是OS X系统的。

Foundation框架
Foundation框架
Foundation框架

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

  • 值对象
  • 集合
  • 操作系统服务 包括下面三个:
    • 文件系统和URL
    • 进程间通讯:这个范畴中的大部分类代表不同的系统端口、套接字、和名字服务器,对实现底层的IPC很有用。NSPipe代表一个BSD管道,即一种进程间的单向通讯通道.
    • 线程和子任务: NSThread类使您可以创建多线程的程序,而各种锁(lock)类则为彼此竞争的线程在访问进程资源时提供各种控制机制。通过NSTask,您的程序可以分出一个子进程来执行其它工作或进行进度监控。
  • 通知
  • 归档和序列化
  • 表达式和条件判断
  • Objective-C语言服务

1.3 UIKit框架

应用程序可以通过三种方式使用UIKit创建界面

  • 在用户界面工具(interface Buidler)从对象库里 拖拽窗口,视图或者其他的对象使用。
  • 用代码创建
  • 通过继承UIView类或间接继承UIView类实现自定义用户界面

框架类组织架构图:

框架类组织架构图

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

2、Cocoa对象

2.1 Objective-C是面向对象的语言

Objective-C和Java C++一样,有封装,继承,多态,重用。但是它不像C++那样有重载操作法、模版和多继承,也没有Java的垃圾回收机制。

2.2 Objective-C的优点

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

  • 动态类-运行时确定类的对象
  • 动态绑定-运行时确定要调用的方法
  • 动态加载—运行时为程序加载新的模块

2.3 动态能力相关的isa指针

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

@interface NSObject <NSObject> {

Class isa;

}

不考虑@interface关键字在编译时的作用,可以把NSObject更接近C语言结构表示为:

struct NSObject{

  Class isa;

}

Class是用typedef 定义的

typedef struct objc_class *Class;

那NSObject可以这么写了

struct NSObject{

  objc_class *isa

}

那objc_class的结构是什么样的呢?大概是这样的:

struct objc_class {

Class isa;

Class super_class;

const char *name;

long version;

long info;

long instance_size;

struct objc_ivar_list *ivars;

struct objc_method_list **methodLists;

struct objc_cache *cache;

struct objc_protocol_list *protocols;

}

这里会看到,在这个结构体里还有一个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 类对象,元类对象等关系。

类继承关系图

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

2.4 根类 NSObject

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

NSObject类

2.4.1 根类和根类协议

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

2.4.2 根类的主要方法:

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

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

2 对象的保持和清理:

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

3 内省和比较

NSObjec有很多方法可以查询对象的运行时信息。这些内省方法有助于找出对象在类层次中的位置,确定对象是否实现特定的方法,以及测试对象是否遵循某种协议。下面是部分方法

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

4 对象的编码和解码

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

  • encodeWithCoder:和initWithCoder:是NSCoding协议仅有的方法。前者使对象可以对其实例变量进行编码,后者则使对象可以根据解码过的实例变量对自身进行初始化。

NSObject类中声明了一些于对象编码有关的方法:classForCoder:、replacementObjectForCoder:、和awakeAfterUsingCoder:。

5 消息的转发

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

6 消息的派发

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

2.5 Cocoa对象生命周期

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

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

对象的生命周期

2 保持接收到的对象

保持接收到的对象

3 拷贝接收到的对象

拷贝接收到的对象

4 自动释放池

自动释放池

参考:

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

转自Cocoa 框架 For iOS(一) 框架的介绍,Objectivie-C运行时能力的解析等

时间: 2024-07-29 02:24:52

iOS Cocoa框架介绍的相关文章

IOS主要框架介绍(转)

本文是<Sunvey the Major Framworks>一文的翻译 框架是一个目录,这个目录包含了共享库,访问共享库里代码的头文件,和其它的图片和声音的资源文件.一个共享库定义的方法或函数可以被应用程序调用. IOS提供了很多你可以在应用程序里调用的框架.要使用一个框架,需要将它添加到你的项目中,你的项目才可以使用它.许多应用程序都使用了如 Foundation.UIKit.和Core Graphics这些框架.根据你为应用程序选择的模版,相关的框架就已经被自动引入了.如果默认加入的框架

IOS整体框架介绍

Cocoa框架是iOS应用程序的基础,了解Cocoa框架,对开发iOS应用有很大的帮助. 1.Cocoa是什么? Cocoa是OS X和 iOS操作系统的程序的运行环境. 是什么因素使一个程序成为Cocoa程序呢?不是编程语言,因为在Cocoa开发中你可以使用各种语言:也不是开发工具,你可以在命令行上就可以创建Cocoa程序.Cocoa程序可以这么说,它是由一些对象组成,而这些对象的类最后都是继承于它们的根类 :NSObject.而且它们都是基于Objective-C运行环境的. 1.1.Coc

IOS 整体框架介绍

转载自  http://blog.csdn.net/likendsl/article/details/44085199 Cocoa框架是iOS应用程序的基础,了解Cocoa框架,对开发iOS应用有很大的帮助. 1.Cocoa是什么? Cocoa是OS X和 iOS操作系统的程序的运行环境. 是什么因素使一个程序成为Cocoa程序呢?不是编程语言,因为在Cocoa开发中你可以使用各种语言:也不是开发工具,你可以在命令行上就可以创建 Cocoa程序.Cocoa程序可以这么说,它是由一些对象组成,而这

iOS多媒体框架介绍

媒体层 媒体层包含图形技术.音频技术和视频技术,这些技术相互结合就可为移动设备带来最好的多媒体体验,更重要的是,它们让创建外观音效俱佳的应用程序变得更加容易.您可以使用iOS的高级框架更快速地创建高级的图形和动画,也可以通过底层框架访问必要的工具,从而以某种特定的方式完成某种任务. 图形技术 高质量的图形是iOS应用程序的重要组成部分.创建应用程序最简单最有效的方法是使用事先渲染过的图片,搭配上标准视图以及UIKit框架的控件,然后把绘制任务交给系统来执行.但是在某些情况下,您可能需要一些UIK

iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角)

iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角) 2015-04-05 15:25 2482人阅读 评论(1) 收藏 举报开源框架 图像: 1.图片浏览控件MWPhotoBrowser       实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩放等操作.      下载:https://github.com/mwaterfall/MWPhotoBrowser目前比较活跃的社区仍旧是Github,

iOS开发-常用第三方开源框架介绍

iOS开发-常用第三方开源框架介绍 图像: 1.图片浏览控件MWPhotoBrowser 实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩放等操作. 下载:https://github.com/mwaterfall/MWPhotoBrowser 目前比较活跃的社区仍旧是Github,除此以外也有一些不错的库散落在Google Code.SourceForge等地方.由于Github社区太过主流,这里主要介绍一下G

iOS框架介绍

iOS框架介绍 Cocoa Touch GameKit  实现对游戏中心的支持,让用户能够在线共享他们的游戏相关的信息 iOS设备之间蓝牙数据传输   从iOS7开始过期   局域网游戏  http://www.cnblogs.com/KidReborn/archive/2011/10/17/2215641.html iAd     用来在应用中提供广告条 广告条与用户UI视图进行合并,与苹果的iAd服务一起工作,自动处理.加载和呈现富媒体广告以及应答在那些广告条上的点击等所有相关的工作.htt

魏兆辉的IOS基础学习笔记之十一 OC语言基础-06 Foundation框架介绍

在之前的博文中,我们创建的项目文件的时候,默认都有引用#import <Foundation/foundation.h> 这个头文件.但是,之前我们对Foundation都没有展开介绍.这篇博文,我们就揭开它神秘的面纱. 之前,我们有提到过OC使用的是Cocoa框架.那么Cocoa和Foundation之间,有啥关联呢?实际上,Cocoa是由许多个不同的框架组成的.最常用的是Foundation和Application Kit. Foundation框架中有很多有用的.面向数据的简单类和数据类

[IOS_HTML5]各种JS框架介绍--用HTML5/CSS3/JS开发Android/IOS应用

现在人人都想成为安卓/IOS应用开发工程师.其实,安卓/IOS应用可以用很多种语言来实现.由于我们前端开发工程师,对HTML5/CSS/JavaScript的网络编程已经相当熟悉了.所以,今天大家将会认识到一些利用前端语言来开发安卓/IOS应用的工具. 在文章的末尾,也介绍了使用JAVA.C#.Lua以及AS3来开发安卓应用的工具. 希望大家都能找到适合自己的开发工具!祝大家开发安卓/IOS应用一切顺利! PhoneGap 开发语言: HTML, CSS, JavaScript 开发工具: Ph