面试准备第四篇

1.Cocoa是什么?

Cocoa是OS X和iOS操作系统的程序的运行环境,在iOS正确的说法是Cocoa Touch

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

请注意:上面的说法还需要做一点限制。首先,Cocoa还有另一个根类,即NSProxy。只是NSProxy很少用于Cocoa编程。其次,您可以创建您自己的根类,只是这需要很多工作(包括编写与Objective-C运行环境进行交互的代码),而且为此花费时间可能是不值得的。

1.1:Cocoa框架

iOS中,Cocoa众多框架中最重要最基础的两个框架是:Foundation和UIKit。

Foundation和界面无关,也可以说和界面无关的类基本是Foundation框架的,和界面相关的是UIKit框架。

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

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

Cocoa框架

1.2:Foundation框架

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

Foundation框架类组织结构图:


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

值对象

集合 

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

通知

归档和序列化

表达式和条件判断

Objective-C语言服务

1.3UIKit框架

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

1.在用户界面工具(interface Buidler)从对象库里拖拽窗口,视图或者其他的对象使用。

2.用代码创建。

3.通过继承UIView类或间接继承UIView类实现自定义用户界面。

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

2.Cocoa对象

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

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

2.2Object-C的优点

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

动态能力有三种:

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

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

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

2.3动态能力相关的isa指针

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

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

@interface NSObject <NSObject> {  

     Class    isa;  

一共三次:类对象->元类对象->NSObject元类对象。

2.4根类NSObject

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

2.4.1根类的根类协议

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

2.4.2根类的主要方法:

1.分配,初始化,和复制:

alloc和allocWithZone:方法用于从某内存区域中分配一个对象内存,并使对象指向其运行时的类定义。

init方法是对象初始化。

new是一个将简单的内存分配和初始化结合起来的方法。

copy和copyWithZone:

2.对象的保持和清理:

retain方法增加对象的保持次数。

release方法减少对象的保持次数。

autorelease方法也是减少对象的保持次数,但是以推迟的方式。

retainCount方法返回对当前的保持次数。

dealloc方法由需要释放对象的实例变量以及释放动态分配的内存的类实现。

3.内省和比较

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

superclass和class方法(实现为类和实例方法)分别以class对象的形式返回接收者的父类和类。

你可以通过isKindOfClass:和isMemberOfClass:方法来确定对象属于哪个类。后者用于测试接收者是否为指定类的实例。isSubclassOfClass:类方法则用于测试类的继承性。

respondsToSelecor:方法用于测试接收者是否实现由选择器参数标识的方法。instancesRespondToSelector:类方法则用于测试给定类的实例是否实现指定的方法。

conformsToProtocol:方法用于测试接收者(对象或类)是否遵循给定的协议。

isEqual:和hash方法用于对象的比较。

description方法允许对象返回一个内容描述字符串;这个方法的输出经常用于调试(“print object”命令),以及在格式化字符串中和“%@”指示符一起表示对象。

4.对象的编码和解码

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

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

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

5.消息的转发

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

6.消息的派发

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

3.Cocoa对象生命周期

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




©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容