ios 面试什么是多态ios下载

 C++编程语言是一款应用广泛支持哆种程序设计的计算机编程语言。我们今天就会为大家详细介绍其中C++多态ios下载性的一些基本知识以方便大家在学习过程中对此能够有一個充分的掌握。
  多态ios下载性可以简单地概括为“一个接口多种方法”,程序在运行时才决定调用的函数它是面向对象编程领域的核心概念。多态ios下载(polymorphisn)字面意思多种形状。
  C++多态ios下载性是通过虚函数来实现的虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override)或者称为重写。(这里我觉得要补充重写的话可以有两种,直接重写成员函数和重写虚函数只有重写了虚函数嘚才能算作是体现了C++多态ios下载性)而重载则是允许有多个同名的函数,而这些函数的参数列表不同允许参数个数不同,参数类型不同戓者两者都不同。编译器会根据这些函数的不同列表将同名的函数的名称做修饰,从而生成一些不同名称的预处理函数来实现同名函數调用时的重载问题。但这并没有体现多态ios下载性
  多态ios下载与非多态ios下载的实质区别就是函数地址是早绑定还是晚绑定。如果函数嘚调用在编译器编译期间就可以确定函数的调用地址,并生产代码是静态的,就是说地址是早绑定的而如果函数调用的地址不能在編译器期间确定,需要在运行时才确定这就属于晚绑定。
  那么多态ios下载的作用是什么呢封装可以使得代码模块化,继承可以扩展巳存在的代码他们的目的都是为了代码重用。而多态ios下载的目的则是为了接口重用也就是说,不论传递过来的究竟是那个类的对象函数都能够通过同一个接口调用到适应各自对象的实现方法。

  最常见的用法就是声明基类的指针利用该指针指向任意一个子类对象,调用相应的虚函数可以根据指向的子类的不同而实现不同的方法。如果没有使用虚函数的话即没有利用C++多态ios下载性,则利用基类指針调用相应的函数的时候将总被限制在基类函数本身,而无法调用到子类中被重写过的函数因为没有多态ios下载性,函数调用的地址将昰一定的而固定的地址将始终调用到同一个函数,这就无法实现一个接口多种方法的目的了。

第二个输出结果就是1、4p->foo()和p->fuu()则是基类指針指向子类对象,正式体现多态ios下载的用法p->foo()由于指针是个基类指针,指向是一个固定偏移量的函数因此此时指向的就只能是基类的foo()函數的代码了,因此输出的结果还是1而p->fun()指针是基类指针,指向的fun是一个虚函数由于每个虚函数都有一个虚函数列表,此时p调用fun()并不是直接调用函数而是通过虚函数列表找到相应的函数的地址,因此根据指向的对象不同函数地址也将不同,这里将找到对应的子类的fun()函数嘚地址因此输出的结果也会是子类的结果4。
  笔试的题目中还有一个另类测试方法即
  问这两调用的输出结果。这是一个用子类嘚指针去指向一个强制转换为子类地址的基类对象结果,这两句调用的输出结果是32。
  并不是很理解这种用法从原理上来解释,甴于B是子类指针虽然被赋予了基类对象地址,但是ptr->foo()在调用的时候由于地址偏移量固定,偏移量是子类对象的偏移量于是即使在指向叻一个基类对象的情况下,还是调用到了子类的函数虽然可能从始到终都没有子类对象的实例化出现。
  而ptr->fun()的调用可能还是因为C++多態ios下载性的原因,由于指向的是一个基类对象通过虚函数列表的引用,找到了基类中fun()函数的地址因此调用了基类的函数。由此可见多態ios下载性的强大可以适应各种变化,不论指针是基类的还是子类的都能找到正确的实现方法。 令人迷惑的隐藏规则
本来仅仅区别重载與覆盖并不算困难但是C++的隐藏规则使问题复杂性陡然增加。
这里“隐藏”是指派生类的函数屏蔽了与其同名的基类函数规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同此时,不论有无virtual
关键字基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名并且参数也相同,但是基类函数没有virtual
关键字此时,基类的函数被隐藏(注意别与覆盖混淆)
  纯虚函數是在基类中声明的虚函数,它在基类中没有定义但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0” 
   1、为了方便使用多态ios下载特性我们常常需要在基类中定义虚拟函数。 
   2、在很多情况下基类本身生成对象是不合情理的。唎如动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理 
  为了解决上述问题,引入了纯虚函数的概念将函数定义为纯虚函数(方法:virtual ReturnType Function()= 0;),则编译器要求在派生类中必须予以重写以实现多态ios下载性同时含有纯虚拟函数的类称为抽象类,咜不能生成对象这样就很好地解决了上述两个问题。
  指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作C++支持两種多态ios下载性:编译时多态ios下载性,运行时多态ios下载性 
  虚函数是在基类中被声明为virtual,并在派生类中重新定义的成员函数可实现成员函數的动态覆盖(Override)
  包含纯虚函数的类称为抽象类。由于抽象类包含了没有定义的纯虚函数所以不能定义抽象类的对象
}

近期为准备找工作面试在网络仩搜集了这些题,以备面试之用

插一条广告:本人求职,2016级应届毕业生有开发经验。可独立开发低薪求职。QQ:

"中"|"字符前面和后面的數据,分别输出它们

注:Key-Value Coding查找方法的时候,不仅仅会查找someKey这个方法还会查找getsomeKey这个方法,前面加一个get或者_someKey以及 _getsomeKey这几种形式。同时查找实例变量的时候也会不仅仅查找someKey这个变量,也会查找_someKey这个变量是否存在)

设计valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时,对象能够在错误发生前有最后的机会响应这个请求。这样做有很多好处下面的两个例子说明了这样做的好处。“

来至cocoa这个说法应该挺有噵理。

因为我们知道button却是存在一个highlighted实例变量.因此为何上面我们只是add一个相关的keypath就行了

可以按照kvc查找的逻辑理解,就说的过去了

答:代悝的目的是改变或传递控制链。允许一个类在某些特定时刻通知到其他类而不需要获取到那些类的指针。可以减少框架复杂度

另外一點,代理可以理解为java中的回调监听机制的一种类似

21. oc中可修改和不可以修改类型。

答:可修改不可修改的集合类这个我个人简单理解就昰可动态添加修改和不可动态添加修改一样。

比如NSArray和NSMutableArray前者在初始化后的内存控件就是固定不可变的,后者可以添加等可以动态申请新嘚内存空间。

22. 我们说的oc是动态运行时语言是什么意思?

答:多态ios下载 主要是将数据类型的确定由编译时,推迟到了运行时

这个问题其实淺涉及到两个概念,运行时和多态ios下载

简单来说,运行时机制使我们直到运行时才去决定一个对象的类别以及调用该类别对象指定方法。

多态ios下载:不同对象以自己的方式响应相同的消息的能力叫做多态ios下载意思就是假设生物类(life)都用有一个相同的方法-eat;

那人类属于生物,猪也属于生物都继承了life后,实现各自的eat但是调用是我们只需调用各自的eat方法。

也就是不同的对象以自己的方式响应了相同的消息(响應了eat这个选择器)

因此也可以说,运行时机制是多态ios下载的基础?~~~

23. 通知和协议的不同之处?

答:协议有控制链(has-a)的关系通知没有。

首先我一开始也不太明白什么叫控制链(专业术语了~)。但是简单分析下通知和代理的行为模式我们大致可以有自己的理解

简单来说,通知的话它鈳以一对多,一条消息可以发送给多个消息接受者

代理按我们的理解,到不是直接说不能一对多比如我们知道的明星经济代理人,很哆时候一个经济人负责好几个明星的事务

只是对于不同明星间,代理的事物对象都是不一样的一一对应,不可能说明天要处理A明星要┅个发布会代理人发出处理发布会的消息后,别称B的

发布会了但是通知就不一样,他只关心发出通知而不关心多少接收到感兴趣要處理。

因此控制链(has-a从英语单词大致可以看出单一拥有和可控制的对应关系。

24. 什么是推送消息?

答:推送通知更是一种技术

简单点就是客戶端获取资源的一种手段。

普通情况下都是客户端主动的pull。

推送则是服务器端主动push 测试push的实现可以查看该博文。

答:多态ios下载子类指针可以赋值给父类。

这个题目其实可以出到一切面向对象语言中

因此关于多态ios下载,继承和封装基本最好都有个自我意识的理解也並非一定要把书上资料上写的能背出来

26. 对于单例的理解

答:在objective-c中要实现一个单例类,至少需要做以下四个步骤:

1).为单例对象实现一个静态實例并初始化,然后设置成nil

2).实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例

3).重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例

答: 事件响应链。包括点击事件画面刷新事件等。在视图棧内从上至下或者从下之上传播。

可以说点事件的分发传递以及处理。具体可以去看下touch事件这块因为问的太抽象化了

严重怀疑题目絀到越后面就越笼统。

可以从责任链模式来讲通过事件响应链处理,其拥有的扩展性

答:frame指的是:该view在父view坐标系统中的位置和大小(参照點是父亲的坐标系统)

bounds指的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)

29. 方法和选择器有何不同?

答:selector是一个方法的名字method昰一个组合体,包含了名字和实现.

详情可以看apple文档

一般我们了解的objective-c对于内存管理都是手动操作的,但是也有自动释放池

但是差了大部汾资料,貌似不要和arc机制搞混就好了

操作和操作队列,基本可以看成java中的线程和线程池的概念用于处理ios多线程开发的问题。

网上部分資料提到一点是虽然是queue,但是却并不是带有队列的概念放入的操作并非是按照严格的先进现出。

这边又有个疑点是对于队列来说,先进先出的概念是Afunc添加进队列Bfunc紧跟着也进入队列,Afunc先执行这个是必然的

但是Bfunc是等Afunc完全操作完以后,B才开始启动并且执行因此队列的概念离乱上有点违背了多线程处理这个概念。

但是转念一想其实可以参考银行的取票和叫号系统

因此对于A比B先排队取票但是B率先执行完操作,我们亦然可以感性认为这还是一个队列

但是后来看到一票关于这操作队列话题的文章,其中有一句提到

“因为两个操作提交的时間间隔很近线程池中的线程,谁先启动是不定的”

瞬间觉得这个queue名字有点忽悠人了,还不如pool~

综合一点我们知道他可以比较大的用处茬于可以帮组多线程编程就好了。

32. 什么是延迟加载?

答:懒汉模式只在用到的时候才去初始化。

也可以理解成延时加载

我觉得最好也最簡单的一个列子就是tableView中图片的加载显示了。

一个延时载避免内存过高,一个异步加载避免线程堵塞。

33. 是否在一个视图控制器中嵌入两個tableview控制器?

答:一个视图控制只提供了一个View视图理论上一个tableViewController也不能放吧,

只能说可以嵌入一个tableview视图当然,题目本身也有歧义如果不是峩们定性思维认为的UIViewController,而是宏观的表 示视图控制者那我们倒是可以把其看成一个视图控制者,它可以控制多个视图控制器比如TabbarController那样的感觉。

34. 一个tableView是否可以关联两个不同的数据源?你会怎么处理?

答:首先我们从代码来看数据源如何关联上的,其实是在数据源关联的代理方法里实现的

因此我们并不关心如何去关联他,他怎么关联上方法只是让我返回根据自己的需要去设置如相关的数据源。

因此我觉得鈳以设置多个数据源啊,但是有个问题是你这是想干嘛呢?想让列表如何显示,不同的数据源分区块显示?

答:当数组在程序运行时需要鈈断变化的,使用NSMutableArray当数组在初始化后,便不再改变的使用NSArray。需要指出的 是使用NSArray只表明的是该数组在运行时不发生改变,即不能往NSAarry的數组里新增和删除元素但不表明其数组內的元素的内容不能发生改

37. 在应用中可以创建多少autorelease对象,是否有限制?

38. 如果我们不创建内存池是否有内存池提供给我们?

答:界面线程维护着自己的内存池,用户自己创建的数据线程则需要创建该线程的内存池

39. 什么时候需要在程序中创建内存池?

答:用户自己创建的数据线程,则需要创建该线程的内存池

41. 什么是简便构造方法?

Foundation下大部分类均有简便构造方法我们可以通过简便构造方法,获得系统给我们创建好的对象并且不需要手动释放。

答:有以下几种保存机制:

1).通过web服务保存在服务器上

2).通过NSCoder固化机制,将对象保存在文件中

答:coredata是苹果提供一套数据保存框架其基于SQlite

答:谓词是通过NSPredicate,是通过给定的逻辑条件作为约束条件完成对数据的篩选。

49. 和coredata一起有哪几种持久化存储机制?

答:Block是可以获取其他函数局部变量的匿名函数其不但方便开发,并且可以大幅提高应用的执行效率(多核心CPU可直接处理Block指令)

51. 写出上面代码的Block的定义

53. 做过的项目是否涉及网络访问功能,使用什么对象完成网络功能?

initWithRequest:delegate:使用的是异步加载当其完成网络访问后,会通过delegate回到主线程并其委托的对象。

答: 多线程是个复杂的概念按字面意思是同步完成多项任务,提高了资源的使鼡效率从硬件、操作系统、应用软件不同的角度去看,多线程被赋予不同的内涵对于 硬件,现在市面上多数的CPU都是多核的多核的CPU运算多线程更为出色;从操作系统角度,是多任务现在用的主流操作系统都是多任务的,可以一边听 歌、一边写博客;对于应用来说多线程鈳以让应用有更快的回应,可以在网络下载时同时响应用户的触摸操作。在iOS应用中对多线程最初的理解,就是并 发它的含义是原来先做烧水,再摘菜再炒菜的工作,会变成烧水的同时去摘菜最后去炒菜。

答: iOS中的多线程是Cocoa框架下的多线程,通过Cocoa的封装可以让我們更为方便的使用线程,做过C++的同学可能会对线程有更多的理解比如 线程的创立,信号量、共享变量有认识Cocoa框架下会方便很多,它对線程做了封装有些封装,可以让我们创建的对象本身便拥有线程,也就是线程的对 象化抽象从而减少我们的工程,提供程序的健壮性

GCD是(Grand Central Dispatch)的缩写 ,从系统级别提供的一个易用地多线程类库具有运行时的特点,能充分利用多核心硬件GCD的API接口为C语言的函数,函数参数Φ多数有Block关 于Block的使用参看这里,为我们提供强大的“接口”对于GCD的使用参见本文

NSOperation是一个抽象类,它封装了线程的细节实现我们可以通过子类化该对象,加上NSQueue来同面向对象的思维管理多线程程序。具体可参看这里:一个基于NSOperation的多线程网络访问的项目

NSThread是一个控制线程執行的对象,它不如NSOperation抽象通过它我们可以方便的得到一个线程,并控制它但NSThread的线程之间的并发控制,是需要我们自己来控制的可以通过NSCondition实现。

在Cocoa的框架下通知、Timer和异步函数等都有使用多线程,(待补充).

答: 项目中使用NSOperation的优点是NSOperation是对线程的高度抽象在项目中使用它,会使项目的程序结构更好子类化 NSOperation的设计思路,是具有面向对象的优点(复用、封装)使得实现是多线程支持,而接口简单建议在复杂项目Φ使用。

项目中使用GCD的优点是GCD本身非常简单、易用对于不复杂的多线程操作,会节省代码量而Block参数的使用,会是代码更为易读建议茬简单项目中使用。

答: 对于闭包(block),有很多定义其中闭包就是能够读取其它函数内部变量的函数,这个定义即接近本质又较好理解对于刚接触Block的同学,会觉得 有些绕因为我们习惯写这样的程序main(){ funA();} funA(){funB();} funB(){…..}; 就是函数main调用函数A,函数A调用函数B… 函数们依次顺序执行但现实中不全是这樣的,例如项目经理M手下有3个程序员A、B、C,当他给程序员A安排实现功能F1时他并不等着A完成之后,再 去安排B去实现F2而是安排给A功能F1,B功能F2C功能F3,然后可能去写技术文档而当A遇到问题时,他会来找项目经理M当B做完时,会通知 M这就是一个异步执行的例子。在这种情形下Block便可大显身手,因为在项目经理M给A安排工作时,同时会告诉A若果遇到困难如何能找到他报告 问题(例如打他手机号),这就是项目經理M给A的一个回调接口要回掉的操作,比如接到电话百度查询后,返回网页内容给A这就是一个Block,在M 交待工作时已经定义好,并且取得了F1的任务号(局部变量)却是在当A遇到问题时,才调用执行跨函数在项目经理M查询百度,获得结果后回调该 block

答: Objective-C是对C语言的扩展,block的實现是基于指针和函数指针

从计算语言的发展,最早的goto高级语言的指针,到面向对象语言的block从机器的思维,一步步接近人的思维鉯方便开发人员更为高效、直接的描述出现实的逻辑(需求)。

声明一个blokc对象注意对象属性设置为copy,接到block 参数时便会自动复制一份。

__block是一種特殊类型

使用该关键字声明的局部变量,可以被block所改变并且其在原函数中的值会被改变。

答: 面试时面试官会先问一些,是否了解block是否使用过block,这些问题相当于开场白往往是下面一系列问题的开始,所以一定要如实根据自己的情况回答

首先要了解什么是委托模式,委托模式在iOS中大量应用其在设计模式中是适配器模式中的对象适配器,Objective-C中使用id类型指向一切对象使委托模式更为简洁。了解委托模式的细节:

iOS设计模式—-委托模式

使用block实现委托模式其优点是回调的block代码块定义在委托对象函数内部,使代码更为紧凑;

适配对象不再需偠实现具体某个protocol代码更为简洁。

功能:在指定的队列里提交一个异步执行的block不阻塞当前线程

通过queue来控制block执行的线程。主线程执行前文萣义的 finishBlock对象

62.谈谈Object-C的内存管理方式及过程

答: 1).当你使用new,alloc和copy方法创建一个对象时,该对象的保留计数器值为1.当你不再使用该对象时,你要负责向该對象发送一条release或autorelease消息.这样,该对象将在使用寿命结束时被销毁.

2).当你通过任何其他方法获得一个对象时,则假设该对象的保留计数器值为1,而且已經被设置为自动释放,你不需要执行任何操作来确保该对象被清理.如果你打算在一段时间内拥有该对象,则需要保留它并确保在操作完成时释放它.

3).如果你保留了某个对象,你需要(最终)释放或自动释放该对象.必须保持retain方法和release方法的使用次数相等.

63.Object-C有私有方法吗?私有变量呢

答: objective-c – 类里媔的方法只有两种, 静态方法和实例方法. 这似乎就不是完整的面向对象了,按照OO的原则就是一个对象只暴露有用的东西. 如果没有了私有方法的話, 对于一些小范围的代码重用就不那么顺手了. 在类里面声名一个私有方法

@private可以用来修饰私有变量

在Objective‐C中,所有实例变量默认都是私有的所有实例方法默认都是公有的

答: 多继承在这里是用protocol 委托代理 来实现的

你不用去考虑繁琐的多继承 ,虚基类的概念.

ood的多态ios下载特性 在 obj-c 中通过委託来实现.

2).你retain或copy的,你需要释放它例如:

对象2接收对象1的一个自动释放的值,或传递一个基本数据类型(NSIntegerNSString)时:你或希望将对象2进行retain,以防圵它在被使用之前就被自动释放掉但是在retain后,一定要在适当的时候进行释放

Alloc/init建立的对象,索引计数为1无需将其再次retain。

[NSArray array]和[NSDate date]等“方法”建立一个索引计数为1的对象但是也是一个自动释放对象。所以是本地临时对象那么无所谓了。如果是打算在全Class中使用的变量(iVar)则必须retain咜。

缺省的类方法返回值都被执行了“自动释放”方法(*如上中的NSArray)

答: 1).obj-c的编译器处理后缀为m的文件时,可以识别obj-c和c的代码处理mm文件可以识別obj-c,c,c++代码,但cpp文件必须只能用c/c++代码而且cpp文件include的头文件中,也不能出现obj-c的代码因为cpp只是cpp

2).在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是问题

3).在cpp中混用obj-c其实就是使用obj-c编写的模块是我们想要的

如果模块以类实现,那么要按照cpp class的标准写类的定义头文件中不能出现obj-c的东西,包括#import cocoa的实現文件中,即类的实现代码中可以使用obj-c的东西可以import,只是后缀是mm。

如果模块以函数实现那么头文件要按c的格式声明函数,实现文件中c++函数内部可以用obj-c,但后缀还是mm或m

总结:只要cpp文件和cpp include的文件中不包含obj-c的东西就可以用了,cpp混用obj-c的关键是使用接口而不能直接使用 实现代 碼,实际上cpp混用的是obj-c编译后的o文件这个东西其实是无差别的,所以可以用obj-c的编译器支持cpp

答: 管理方式:对于栈来讲,是由编译器自动管悝无需我们手工控制;对于堆来说,释放工作由程序员控制容易产生memory leak。

栈:在Windows下,栈是向低地址扩展的数据结构是一块连续的内存的區域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的在 WINDOWS下,栈的大小是2M(也有的说是1M总之是一个编译时就确定的常數),如果申请的空间超过栈的剩余空间时将提示overflow。因 此能从栈获得的空间较小。

堆:堆是向高地址扩展的数据结构是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的自然是不连续的,而链表的遍历方向是由低地址向高地址堆的大小受限于计算机系统中有效的虚拟内存。由此可见堆获得的空间比较灵活,也比较大

碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连續从而造成大量的碎片,使程序效率降低对于栈来讲,则不会存在这个问题因为栈是先进后出的队列,他们是如此的一一对应以臸于永远都不可能有一个内存块从栈中间弹出

分配方式:堆都是动态分配的,没有静态分配的堆栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的比如局部变量的分配。动态分配由alloca函数进行分配但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放无需我们手工实现。

分配效率:栈是机器系统提供的数据结构计算机会在底层对栈提供支持:分配专门的寄存器存放栈的哋址,压栈出栈都有专门的指令执行这就决定了栈的效率比较高。堆则是C/C++函数库提供的它的机制是很复杂的。

70.用预处理指令#define声明一个瑺数用以表明1年中有多少秒(忽略闰年问题)

我在这想看到几件事情:

#define 语法的基本知识(例如:不能以分号结束,括号的使用等等)

慬得预处理器将为你计算常数表达式的值,因此直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的

意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。

如果你在你的表达式中用到UL(表示无符号长整型)那么你有了一个好的起点。记住第一印象很重要。

71.写一个”标准"宏MIN 这个宏输入两个参数并返回较小的一个。

这個测试是为下面的目的而设的:

标识#define在宏中应用的基本知识这是很重要的,因为直到嵌入(inline)操作符变为标准C的一部分宏是方便产生嵌入玳码的唯一方

对于嵌入式系统来说,为了能达到要求的性能嵌入代码经常是必须的方法。

三重条件操作符的知识这个操作符存在C语言Φ的原因是它使得编译器能产生比 if-then-else 更优化的代码,了解这个用法是很重要的

懂得在宏中小心地把参数用括号括起来

我也用这个问题开始討论宏的副作用,例如:当你写下面的代码时会发生什么事

这个表达式会产生副作用,指针p会作三次++自增操作

const 意味着"只读",下面的声奣都是什么意思

前两个的作用是一样,a是一个常整型数

第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的但指针可以)。

第四个意思a是一个指向整型数的常指针(也就是说指针指向的整型数是可以修改的,但指针是不可修改的)

最后一个意菋着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的同时指针也是不可修改的)。

关键字const的作用是为给读你玳码的人传达非常有用的信息实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的

如果你曾花很多时间清理其它人留丅的垃圾,你就会很快学会感谢这点多余的信息(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的)  通过给优化器一些附加的信息使用关键字const也许能产生更紧凑的代码。合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参 数防止其被无意的代碼修改。简而言之这样可以减少bug的出现。

1).欲阻止一个变量被改变可以使用 const 关键字。在定义该 const 变量时通常需要对它进行初

始化,因为鉯后就没有机会再去改变它了;

2).对指针来说可以指定指针本身为 const,也可以指定指针所指的数据为 const或二者同时指

3).在一个函数声明中,const 可鉯修饰形参表明它是一个输入参数,在函数内部不能改变其值;

4).对于类的成员函数若指定其为 const 类型,则表明其是一个常函数不能修妀类的成员变量;

5).对于类的成员函数,有时候必须指定其返回值为 const 类型以使得其返回值不为“左值”。

73. 关键字volatile有什么含意?并给出三个不哃的例子

答:一个定义为 volatile的变量是说这变量可能会被意想不到地改变,这样编译器就不会去假设这个变量的值了。精确地说就是优囮器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份

下面是volatile变量的几个例子:

并行设备嘚硬件寄存器(如:状态寄存器)

多线程应用中被几个任务共享的变量

74. 一个参数既可以是const还可以是volatile吗? 一个指针可以是volatile 吗解释为什么。

答:1).是的一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变它是const因为程序不应该试图去修改它。

2).是的尽管这并不很瑺见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时

1).函数体内 static 变量的作用范围为该函数体,不同于 auto 变量该变量的内存只被分配一次,

因此其值在下次调用时仍维持上次的值;

2).在模块内的 static 全局变量可以被模块内所用函数访问但不能被模块外其它函数访问;

3).茬模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明

4).在类中的 static 成员变量属于整个类所拥有对类的所有對象只有一份拷贝;

5).在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针因而只能访问类的static 成员变量。

76. 线程与进程的区别和联系?

1). 進程和线程都是由操作系统所体会的程序运行的基本单元系统利用该基本单元实现系统对应用的并发性

2). 进程和线程的主要差别在于它们昰不同的操作系统资源管理方式。

3). 进程有独立的地址空间一个进程崩溃后,在保护模式下不会对其它进程产生影响而线程只是一个进程中的不同执行路径。

4.)线程有自己的堆栈和局部变量但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉所以多进程嘚程序要比多线程的程序健壮,但在进程切换时耗费资源较大,效率要差一些

5). 但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。

77. 列举几种进程的同步机制并比较其优缺点。

78. 进程之间通信的途径

答:共享存储系统消息传递系统管道:以文件系统为基础

79. 进程死锁的原因

答:资源竞争及进程推进顺序非法

80. 死锁的4个必要条件

答:互斥、请求保持、不可剥夺、环路

答:鸵鸟筞略、预防策略、避免策略、检测与解除死锁

答:iPhone OS 应用程序的基础 Cocoa Touch 框架重用了许多 Mac 系统的成熟模式但是它更多地专注于触摸的接口和优囮。

UIKit 为您提供了在 iPhone OS 上实现图形事件驱动程序的基本工具,其建立在和 Mac OS X 中一样的 Foundation 框架上包括文件处理,网络字符串操作等。

Cocoa Touch 具有和 iPhone 用戶接口一致的特殊设计有了 UIKit,您可以使用 iPhone OS 上的独特的图形接口控件按钮,以及全屏视图的功能您还可以使用加速仪和多点触摸手势來控制您的应用。

各色俱全的框架 除了UIKit 外Cocoa Touch 包含了创建世界一流 iPhone 应用程序需要的所有框架,从三维图形到专业音效,甚至提供设备访问 API 鉯控制摄像头或通过 GPS 获知当前位置。

Cocoa Touch 既包含只需要几行代码就可以完成全部任务的强大的 Objective-C 框架也在需要时提供基础的 C 语言 API 来直接访问系统。这些框架包括:

Core Animation:通过 Core Animation您就可以通过一个基于组合独立图层的简单的编程模型来创建丰富的用户体验。

Core Audio:Core Audio 是播放处理和录制音頻的专业技术,能够轻松为您的应用程序添加强大的音频功能

Core Data:提供了一个面向对象的数据管理解决方案,它易于使用和理解甚至可處理任何应用或大或小的数据模型。

下面是 Cocoa Touch 中一小部分可用的框架:

83. 自动释放池是什么,如何工作

答:当您向一个对象发送一个autorelease消息时Cocoa就會将该对象的一个引用放入到最新的自动释放.它仍然是个正当的对象,因此自 动释放池定义的作用域内的其它对象可以向它发送消息当程序执行到作用域结束的位置时,自动释放池就会被释放池中的所有对象也就被释放。

6).不是一个过度复杂的 C 衍生语言

2).不支持运算符重载

4).使用动态运行时类型所有的方法都是函数调用,所以很多编译时优化方法都用不到(如内联函数等),性能低劣

1). sprintf是格式化函数。将┅段数据通过特定的格式格式化到一个字符串缓冲区中去。sprintf格式化的函数的长度不可控有可能格式化后的字符串会超出缓冲区的大小,造成溢出

将src开始的一段字符串拷贝到dst开始的内存中去,结束的标志符号为 ‘\0'由于拷贝的长度不是由我们自己控制的,所以这个字符串拷贝很容易出错

答:@property是一个属性访问声明,扩号内支持以下几个属性:

2).assignsetter方法直接赋值,不进行任何retain操作为了解决原类型与环循引鼡问题

4).copy,setter方法进行Copy操作与retain处理流程一样,先旧值release再 Copy出新的对象,retainCount为1这是为了减少对上下文的依赖而引入的机制。

5).nonatomic非原子性访问,鈈加同步多线程并发访问会提高性能。注意如果不加此属性,则默认是两个访问方法都为原子型事务访问锁被加到所属对象实例级。

答: http是客户端用http协议进行请求发送请求时候需要封装http请求头,并绑定请求的数据服务器一般有web服务器配合(当然也非绝对)。 http请求方式为客户端主动发起请求服务器才能给响应,一次请求完毕后则断开连接以节省资源。服务器不能主动给客户端响应(除非采取http长連接 技术)iphone主要使用类是NSUrlConnection。

scoket是客户端跟服务器直接使用socket“套接字”进行连接并没有规定连接后断开,所以客户端和服务器可以保持连接通道双方 都可以主动发送数据。一般在游戏开发或股票开发这种要求即时性很强并且保持发送数据量比较大的场合使用主要使用类昰CFSocketRef。

答: TCP全称是Transmission Control Protocol中文名为传输控制协议,它可以提供可靠的、面向连接的网络数据传递服务传输控制协议主要包含下列任务和功能:

* 確保IP数据报的成功传递。

* 对程序发送的大块数据进行分段和重组

* 确保正确排序及按顺序传递分段的数据。

* 通过计算校验和进行传输数據的完整性检查。

TCP提供的是面向连接的、可靠的数据流传输而UDP提供的是非面向连接的、不可靠的数据流传输。

简单的说TCP注重数据安全,而UDP数据传输快点但安全性一般

89. 你了解svn,cvs等版本控制工具么?

答: 版本控制 svn,cvs 是两种版控制的器,需要配套相关的svncvs服务器。

scm是xcode里配置版本控淛的地方版本控制的原理就是a和b同时开发一个项目,a写完当天的代码之后把代码提交给服务器b要做的时候先从 服务器得到最新版本,僦可以接着做 如果a和b都要提交给服务器,并且同时修改了同一个方法就会产生代码冲突,如果a先提交那么b提交时,服务器可以提示沖突的代码b可以清晰的看到, 并做出相应的修改或融合后再提交到服务器

答: 客户端程序留下后门端口,客户端总是监听针对这个后門的请求于是 服务器可以主动像这个端口推送消息。

答:此为.a文件相当于java里的jar包,把一些类编译到一个包中在不同的工程中如果导叺此文件就可以使用里面的类,具体使用依然是#import “ xx.h”

答: 音视频编解码框架,内部使用UDP协议针对流媒体开发内部开辟了六个端口来接受流媒体数据,完成快速接受之目的

答:数据库框架,对sqllite的数据操作进行了封装使用着可把精力都放在sql语句上面。

94. 什么是沙盒模型哪些操作是属于私有api范畴?

答:某个iphone工程进行文件操作有此工程对应的指定的位置,不能逾越

97. 简述内存分区情况

1).代码区:存放函数二进制玳码

2).数据区:系统运行时申请内存并初始化,系统退出时由系统释放存放全局变量、静态变量、常量

3).堆区:通过malloc等函数或new等操作符动态申请得到,需程序员手动申请和释放

4).栈区:函数模块内申请函数结束时由系统自动释放。存放局部变量、函数参数

98. 队列和栈有什么区别:

答:队列和栈是两种不同的数据容器从”数据结构”的角度看,它们都是线性结构即数据元素之间的关系相同。

队列是一种先进先絀的数据结构它在两端进行操作,一端进行入队列操作一端进行出列队操作。

栈是一种先进后出的数据结构它只能在栈顶进行操作,入栈和出栈都在栈顶操作

GET 方法提交数据不安全,数据置于请求行客户端地址栏可见;

GET 方法提交的数据大小有限

GET 方法不可以设置书签

POST 方法提交数据安全,数据置于消息主体内客户端不可见

POST 方法提交的数据大小没有限制

POST 方法可以设置书签

102.  xib文件的构成分为哪3个图标?都具有什么功能

答: File’s Owner 是所有 nib 文件中的每个图标,它表示从磁盘加载 nib 文件的对象;

View 显示用户界面;完成用户交互;是 UIView 类或其子类

103.  简述视图控件器的生命周期。

答: loadView 尽管不直接调用该方法如多手动创建自己的视图,那么应该覆盖这个方法并将它们赋值给试图控制器的 view 属性

viewDidLoad 只囿在视图控制器将其视图载入到内存之后才调用该方法,这是执行任何其他初始化操作的入口

viewDidUnload 当试图控制器从内存释放自己的方法的时候调用,用于清楚那些可能已经在试图控制器中创建的对象

viewVillAppear 当试图将要添加到窗口中并且还不可见的时候或者上层视图移出图层后本视圖变成顶级视图时调用该方法,用于执行诸如改变视图方向等的操作实现该方法时确保调用 [super viewWillAppear:

viewDidAppear 当视图添加到窗口中以后或者上层视图移出圖层后本视图变成顶级视图时调用,用于放置那些需要在视图显示后执行的代码确保调用 [super viewDidAppear:] 。

104.  动画有基本类型有哪几种;表视图有哪几種基本样式

答:动画有两种基本类型:隐式动画和显式动画。

105.  实现简单的表格显示需要设置UITableView的什么属性、实现什么协议

1).UIView 是 iOS 系统中界面え素的基础,所有的界面元素都是继承自它它本身完全是由 CoreAnimation 来实现的。它真正的绘图部分是由一个 CALayer 类来管理。 UIView 本身更像是一个 CALayer 的管理器访问它的跟绘图和跟坐标有关的属性。

4).UIView 的 layer 树形在系统内部被维护着三份 copy 。分别是逻辑树这里是代码可以操纵的;动画树,是一个Φ间层系统就在这一层上更改属性,进行各种渲染操作;显示树其内容就是当前正被显示在屏幕上得内容。

5).动画的运作:对 UIView 的 subLayer (非主 Layer )属性进行更改系统将自动进行动画生成,动画持续时间的缺省值似乎是 0.5 秒

7).渲染:当更新层,改变不能立即显示在屏幕上当所有的層都准备好时,可以调用setNeedsDisplay 方法来重绘显示

9).变形: Quartz Core 的渲染能力,使二维图像可以被自由操纵就好像是三维的。图像可以在一个三维坐标系中以任意角度被旋转缩放和倾斜。 CATransform3D 的一套方法提供了一些魔术般的变换效果

108. Quatrz 2D的绘图功能的三个核心概念是什么并简述其作用。

答:仩下文:主要用于描述图形写入哪里;

路径:是在图层上绘制的内容;

状态:用于保存配置变换的值、填充和轮廓 alpha 值等。

111.  有哪几种手势通知方法、写清楚方法名

答:创建 Socket 的上下文;创建 Socket ;配置要访问的服务器信息;封装服务器信息;连接服务器;

答:iOS 中可以有四种持久囮数据的方式:属性列表(plist)、对象归档、 SQLite3 和 Core Data; core data 可以使你以图形界面的方式快速的定义 app 的数据模型,同时在你的代码中容易获取到它 coredata 提供了基础结构去处理常用的功能,例如保存恢复,撤销和重做允许你在 app 中继续创建新的任务。在使用 core data 的时候你不用安装额外的数据库系統,因为 core data 使用内置的 sqlite 数据库 core data 将你 app 的模型层放入到一组定义在内存中的数据对象。 coredata 会追踪这些对象的改变同时可以根据需要做相反的改變,例如用户执行撤销命令当 core data 在对你 app 数据的改变进行保存的时候, core data 会把这些数据归档并永久性保存。 mac os x 中sqlite 库它是一个轻量级功能强大嘚关系数据引擎,也很容易嵌入到应用程序可以在多个平台使用, sqlite 是一个轻量级的嵌入式 sql 数据库编程与 core data 框架不同的是, sqlite 是使用程序式嘚 sql 的主要的 API 来直接操作数据表。 Core Data 不是一个关系型数据库也不是关系型数据库管理系统 (RDBMS) 。虽然 Core Dta 支持SQLite 作为一种存储类型但它不能使用任意的 SQLite 数据库。 Core Data 在使用的过程种自己创建这个数据库 Core Data 支持对一、对多的关系。

答:UITableView 通过重用单元格来达到节省内存的目的: 通过为每个单元格指定一个重用标识符(reuseIdentifier),即指定了单元格的种类,以及当单元格滚出屏幕时,允许恢复单元格以便重用.对于 不同种类的单元格使用不同的ID,对于简單的表格,一个标识符就够了.

}

人在面试途中都是套路啊!!!。

Objective-C 简称OC(下面以此代称)是在C语言的基础上,增加了一层最小的面向对象语言是一种静态输入的语言,即“必须先声明数据中每个變量(或者容器)的数据类型”但它是一个动态语言,代码中的某一部分可以在app运行的时候被扩展和修改(比如在被编译之后)。OC完铨兼容C语言在代码中,可以混用c甚至是c++代码。

面向对象三原则(封装继承,多态ios下载)

面向对象具有四个基本特征:抽象封装,繼承和多态ios下载

C语言是面向过程的语言(关注的是函数),OC,C++,JAVA,C#,PHP,Swift是面向对象的面向过程关注的是解决问题涉及的步骤,而面向对象关注的是设計能够实现解决问题所需功能的类抽象是面向对象的思想基础。

抽象包括两个方面一是过程抽象,二是数据抽象过程抽象是指任何┅个明确定义功能的操作都可被使用者看作单个的实体看待,尽管这个操作实际上可能由一系列更低级的操作来完成数据抽象定义了数據类型和施加于该类型对象上的操作,并限定了对象的值只能通过使用这些操作修改和观察抽象是一种思想,封装继承和多态ios下载是这種思想的实现

封装是把过程和数据包围起来(即函数和数据结构,函数是行为数据结构是描述),有限制的对数据的访问面向对象基于这个基本概念开始的(因为面向对象更注重的是类),即现实世界可以被描绘成一系列完全自治、封装的对象这些对象通过一个受保护的接口访问其他对象。一旦定义了一个对象的特性则有必要决定这些特性的可见性,封装保证了模块具有较好的独立性使得程序維护修改较为容易。对应用程序的修改仅限于类的内部因而可以将应用程序修改带来的影响减少到最低限度。但是封装会导致并行效率問题因为执行部分和数据部分被绑定在一起,制约了并行程度面向对象思想将函数和数据绑在一起,扩大了代码重用时的粒度而且葑装下的拆箱装箱过程中也会导致内存的浪费。

继承是一种层次模型允许和鼓励类的重用,并提供了一种明确表述共性的方法新类继承了原始类的特性,新类称为原始类的派生类(子类和父类)派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加噺的方法使之更适合特殊的需要继承性很好的解决了软件的可重用性问题。但是不恰当地使用继承导致的最大的一个缺陷特征就是高耦合(即“牵一发而动全身”,是设计类时层次没分清导致的)解决方案是用组合替代继承。将模块拆开然后通过定义好的接口进行茭互,一般来说可以选择Delegate模式来交互使用继承其实是如何给一类对象划分层次的问题。在正确的继承方式中父类应当扮演的是底层的角色,子类是上层的业务父类只是给子类提供服务,并不涉及子类的业务逻辑;层级关系明显功能划分清晰;父类的所有变化,都需偠在子类中体现此时耦合已经成为需求。

多态ios下载性是指允许不同类的对象对同一消息作出响应多态ios下载性包括参数化多态ios下载性和包含多态ios下载性。很好的解决了应用程序函数同名问题多态ios下载一般都要跟继承结合起来说,其本质是子类通过覆盖或重载父类的方法来使得对同一类对象同一方法的调用产生不同的结果。覆盖是对接口方法的实现继承中也可能会在子类覆盖父类中的方法。重载是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法然后再调用时,VM就会根据不同的参数样式来选择合适嘚方法执行。在使用重载时只能通过不同的参数样式例如,不同的参数类型不同的参数个数,不同的参数顺序(当然同一方法内的幾个参数类型必须不一样); 但继承会引入多态ios下载使用混乱的境况并产生耦合,更好的方法是使用接口通过IOP将子类与可能被子类引入嘚不相关逻辑剥离开来,提高了子类的可重用性降低了迁移时可能的耦合。接口规范了子类哪些必须实现哪些可选实现。那些不在接ロ定义的方法列表里的父类方法事实上就是不建议覆重的方法。如果引入多态ios下载之后导致对象角色不够单纯那就不应当引入多态ios下載,如果引入多态ios下载之后依旧是单纯角色那就可以引入多态ios下载;如果要覆重的方法是角色业务的其中一个组成部分,那么就最好不偠用多态ios下载的方案用IOP,因为在外界调用的时候其实并不需要通过多态ios下载来满足定制化的需求

Objective-C 是面相运行时的语言,它会尽可能的紦编译和链接时要执行的逻辑延迟到运行时使用Runtime可以按需要把消息重定向给合适的对象,交换方法的实现等等

Runtime简称运行时,其中最主偠的是消息机制是一个主要使用 C 和汇编写的库,为 C 添加了面相对象的能力并创造了 Objective-C。OC的函数调用称为消息发送属于动态调用过程。茬编译的时候并不能决定真正调用哪个函数(在编 译阶段OC可以调用任何函数,即使这个函数并未实现只要声明过就不会报错。而C语言茬编译阶段就会报错)只有在真正运行的时候才会根据函数的名称找

编译器执行上述转换。在objc_msgSend函数中首先通过obj的isa指针找到obj对应的class。每個对象内部都默认有一个isa指针指向这个对象所使用的类isa是对象中的隐藏指针,指向创建这个对象的类在Class中先去cache中通过SEL查找对应函数method(cacheΦmethod列表是以SEL为key通过hash表来存储的,这样能提高函数查找速度)若cache中未找到,再去methodList中查找,若methodlist中未找到则取superClass中查找。若能找到则将method加入到cacheΦ,以方便下次查找并通过method中的函数指针跳转到对应的函数中去执行。

OC的动态特性表现为了三个方面:动态类型、动态绑定、动态加载之所以叫做动态,是因为必须到运行时(runtime)才会做一些事情

动态类型,就是id类型动态类型是跟静态类型相对的。内置的基本类型都属于靜态类型(int、NSString等)静态类型在编译的时候就能被识别出来(即前面说的静态输入)。所以若程序发生了类型不对应,编译器就会发出警告而动态类型就编译器编译的时候是不能被识别的,要等到运行时(runtime)即程序运行的时候才会根据语境来识别。所以这里面就有两个概念要汾清:编译时跟运行时

动态语言和静态语言的一个区别是静态语言提前编译好文件,即所有的逻辑已在编译时确定运行时直接加载编譯后的文件;而动态语言是在运行时才确定实现。典型的静态语言是C++动态语言包括OC,JAVAC#等;因为静态语言提前编译好了执行文件,吔就是通常所说的静态语言效率较高的原因

binding)需要用到@selector/SEL。先来看看“函数”对于其他一些静态语言,比如c++,一般在编译的时候就已经将要調用的函数的函数签名都告诉编译器了静态的,不能改变而在OC中,其实是没有函数的概念的我们叫“消息机制”,所谓的函数调用僦是给对象发送一条消息这时,动态绑定的特性就来了OC可以先跳过编译,到运行的时候才动态地添加函数调用在运行时才决定要调鼡什么方法,需要传什么参数进去这就是动态绑定。要实现他就必须用SEL变量绑定一个方法最终形成的这个SEL变量就代表一个方法的引用。这里要注意一点:SEL并不是C里面的函数指针虽然很像,但真心不是函数指针SEL变量只是一个整数,他是该方法的ID以前的函数调用,是根据函数名也就是字符串去查找函数体。但现在我们是根据一个ID整数来查找方法,整数的查找自然要比字符串的查找快得多!所以動态绑定的特定不仅方便,而且效率更高

动态加载就是根据需求动态地加载资源,在运行时加载新类在运行时创建一个新类,只需要3步:

茬Objective-C中调用一个方法,其实是向一个对象发送消息查找消息的唯一依据是selector的名字。利用Objective-C的动态特性可以实现在运行时偷换selector对应的方法实現,达到给方法挂钩的目的每个类都有一个方法列表,存放着selector的名字和方法实现的映射关系IMP类似函数指针,指向具体的Method实现

RunLoop是一让線程能随时处理事件但不退出的机制。RunLoop实际上是一个对象这个对象管理了其需要处理的事件和消息,并提供了一个入口函数来执行Event Loop的逻輯线程执行了这个函数后,就会一直处于这个函数内部 "接受消息->等待->处理" 的循环中直到这个循环结束(比如传入 quit 的消息),函数返回让线程在没有处理消息时休眠以避免资源占用、在有消息到来时立刻被唤醒。一个runloop就是一个事件处理循环用来不停的监听和处理输入倳件并将其分配到对应的目标上进行处理。

RunLoop的四个作用为:使程序一直运行接受用户输入;决定程序在何时应该处理哪些Event;调用解耦;节省CPU时间

線程和 RunLoop 之间是一一对应的,其关系是保存在一个全局的 Dictionary 里线程刚创建时并没有 RunLoop,如果你不主动获取那它一直都不会有。RunLoop 的创建是发生茬第一次获取时RunLoop 的销毁是发生在线程结束时。你只能在一个线程的内部获取其RunLoop(主线程除外)

主线程的runloop默认是启动的。

NSRunLoop是一种更加高奣的消息处理模式在对消息处理过程进行了更好的抽象和封装,不用处理一些很琐碎很低层次的具体消息的处理在NSRunLoop中每一个消息就被咑包在input source或者是timer source中了。使用run loop可以使你的线程在有工作的时候工作没有工作的时候休眠,可以大大节省系统资源

对其它线程来说,runloop默认是沒有启动的如果你需要更多的线程交互则可以手动配置和启动,如果线程只是去执行一个长时间的已确定的任务则不需要在任何一个Cocoa程序的线程中,都可以通过:

获取到当前线程的runloop

我们不能在一个线程中去操作另外一个线程的runloop对象,那很可能会造成意想不到的后果泹是CoreFundation中的不透明类CFRunLoopRef是线程安全的,而且两种类型的runloop完全可以混合使用Cocoa中的NSRunLoop类可以通过实例方法:

获取对应的CFRunLoopRef类,来达到线程安全的目的

Runloop的管理并不完全是自动的。我们仍必须设计线程代码以在适当的时候启动runloop并正确响应输入事件当然前提是线程中需要用到runloop。而且我們还需要使用while/for语句来驱动runloop能够循环运行,下面的代码就成功驱动了一个run loop:

在使用手动的内存管理方式的项目中会经常用到很多自动释放嘚对象,如果这些对象不能够被即时释放掉会造成内存占用量急剧增大。Runloop就为我们做了这样的工作每当一个运行循环结束的时候,它嘟会释放一次autorelease pool同时pool中的所有自动释放类型变量都会被释放掉。

系统默认注册了5个Mode:

此方法创建的定时器必须加到NSRunLoop中。

NSRunLoopCommonModes第一个参数为默認参数,当下面有textViewtextfield等控件时,拖拽控件此时轮播器会停止轮播,是因为NSRunLoop的原因NSRunLoop为一个死循环,实时监测有无事件响应如果当前线程就是主线程,也就是UI线程时某些UI事件,比如UIScrollView的拖动操作会将Run

此种创建定时器的方式,默认加到了runloop且默认为第二个参数。

UIApplicationMain() 函数会为main thread 設置一个NSRunLoop 对象这就解释了app应用可以在无人操作的时候休息,需要让它干活的时候又能立马响应

仅当在为你的程序创建辅助线程的时候,你才需要显式运行一个runloopRunloop是程序主线程基础设施的关键部分,所以,Cocoa和Carbon程序提供了代码运行主程序的循环并自动启动runloopIOS程序中UIApplication的run方法(或Mac OS XΦ的NSApplication)作为程序启动步骤的一部分,它在程序正常启动的时候就会启动程序的主循环如果你使用xcode提供的模板创建你的程序,那你永远不需要自己去显式的调用这些例程

对于辅助线程,你需要判断一个runloop是否是必须的如果是必须的,那么你要自己配置并启动它你不需要茬任何情况下都去启动一个线程的runloop。比如你使用线程来处理一个预先定义的长时间运行的任务时,你应该避免启动runloopRunloop在你要和线程有更哆的交互时才需要,比如以下情况:

1.使用端口或自定义输入源来和其他线程通信;

2.使用线程的定时器;

4.使线程周期性工作;

对于IOS设备用户来说操作设备的方式主要有三种:触摸屏幕、晃动设备、通过遥控设施控制设备。对应的事件类型有以下三种:

事件的传递和响应分两个链:

傳递链:由系统向离用户最近的view传递

响应链:由离用户最近的view向系统传递。

响应者链(Responder Chain):由多个响应者对象连接起来的链条作用是能佷清楚的看见每个响应者之间的联系,并且可以让一个事件多个对象处理

响应者对象(Responder Object),指的是有响应和处理事件能力的对象响应鍺链就是由一系列的响应者对象构成的一个层次结构。

1、响应者链通常是由视图(UIView)构成的;

2、一个视图的下一个响应者是它视图控制器(UIViewController)(如果有的话)然后再转给它的父视图(Super View);

3、视图控制器(如果有的话)的下一个响应者为其管理的视图的父视图;

4、单例的窗ロ(UIWindow)的内容视图将指向窗口本身作为它的下一个响应者,Cocoa Touch应用不像Cocoa应用它只有一个UIWindow对象,因此整个响应者链要简单一点;

5、单例的应鼡(UIApplication)是一个响应者链的终点它的下一个响应者指向nil,以结束整个循环

iOS系统检测到手指触摸(Touch)操作时会将其打包成一个UIEvent对象,并放入当湔活动Application的事件队列单例的UIApplication会从事件队列中取出触摸事件并传递给单例的UIWindow来处理,UIWindow对象首先会使用hitTest:withEvent:方法寻找此次Touch操作初始点所在的视图(View)即需要将触摸事件传递给其处理的视图,这个过程称之为hit-test

UIWindow实例对象会首先在它的内容视图上调用hitTest:withEvent:此方法会在其视图层级结构中的每个视圖上调用pointInside:withEvent:(该方法用来判断点击事件发生的位置是否处于当前视图范围内,以确定用户是不是点击了当前视图)如果pointInside:withEvent:返回YES,则继续逐级調用直到找到touch操作发生的位置,这个视图也就是要找的hit-test

首先调用当前视图的pointInside:withEvent:方法判断触摸点是否在当前视图内;若返回NO,则hitTest:withEvent:返回nil;若返回YES,则姠当前视图的所有子视图(subviews)发送hitTest:withEvent:消息所有子视图的遍历顺序是从最顶层视图一直到到最底层视图,即从subviews数组的末尾向前遍历直到有子视圖返回非空对象或者全部子视图遍历完毕;若第一次有子视图返回非空对象,则hitTest:withEvent:方法返回此对象处理结束;如所有子视图都返回非,则hitTest:withEvent:方法返回自身(self)

MRC:手动引用计算器(由于现在几乎不用了,不做过多解说)

在MRC的内存管理模式下与对变量的管理相关的方法有:retain,release和autorelease。retain和release方法操作的是引用记数当引用记数为零时,便自动释放内存并且可以用NSAutoreleasePool对象,对加入自动释放池(autorelease调用)的变量进行管理当内存紧张時回收内存。

(1) retain该方法的作用是将内存数据的所有权附给另一指针变量,引用数加1即retainCount+= 1;

(2) release,该方法是释放指针变量对内存数据的所囿权引用数减1,即retainCount-= 1;

在ARC中与内存管理有关的标识符可以分为变量标识符和属性标识符,对于变量默认为__strong而对于属性默认为unsafe_unretained。也存在autoreleasepool

app應用程序有5种状态:

Inactive未激活:程序在前台运行,不过没有接收到事件在没有事件处理情况下程序通常停留在这个状态。

Active激活:程序在前囼运行而且接收到了事件这也是前台的一个正常的模式。

Backgroud后台:程序在后台而且能执行代码大多数程序进入这个状态后会在在这个状態上停留一会。时间到之后会进入挂起状态(Suspended)有的程序经过特殊的请求后可以长期处于Backgroud状态。

Suspended挂起:程序在后台不能执行代码系统会自動把程序变成这个状态而且不会发出通知。当挂起时程序还是停留在内存中的,当系统内存低时系统就把挂起的程序清除掉,为前台程序提供更多的内存

1、application didFinishLaunchingWithOptions:当应用程序启动时执行,应用程序启动入口只在应用程序启动时执行一次。若用户直接启动lauchOptions内无数据,若通過其他方式启动应用,lauchOptions包含对应方式的内容

2、applicationWillResignActive:在应用程序将要由活动状态切换到非活动状态时候,要执行的委托调用如 按下 home 按钮,返回主屏幕或全屏之间切换应用程序等。

当应用程序进入后台时,应该保存用户数据或状态信息所有没写到磁盘的文件或信息,在进入後台时最后都写到磁盘去,因为程序可能在后台被杀死释放尽可能释放的内存。

方法有大概5秒的时间让你完成这些任务如果超过时間还有未完成的任务,你的程序就会被终止而且从内存中清除

如果还需要长时间的运行任务,可以在该方法中调用

程序只要符合以下情況之一只要进入后台或挂起状态就会终止:

②app是基于iOS4.0之前系统开发的。

系统常常是为其他app启动时由于内存不足而回收内存最后需要终止應用程序但有时也会是由于app很长时间才响应而终止。如果app当时运行在后台并且没有暂停系统会在应用程序终止之前调用app的代理的方法 - (void)applicationWillTerminate:(UIApplication *)application,这样可以让你可以做一些清理工作你可以保存一些数据或app的状态。这个方法也有5秒钟的限制超时后方法会返回程序从内存中清除。鼡户可以手工关闭应用程序

OC中方法的实现只能写在@implementation··@end中,对象方法的声明只能写在@interface···@end中间;对象方法都以-号开头类方法都以+号开頭;函数属于整个文件,可以写在文件中的任何位置包括@interface··@end中,但写在@interface···@end会无法识别;

对象方法只能由对象来调用类方法只能由類来调用,不能当做函数一样调用对象方法归类\\\\对象所有;类方法调用不依赖于对象;类方法内部不能直接通过成员变量名访问对象的荿员变量。OC只支持单继承没有接口,但可以用delegate代替

Objective-C与其他语言最大的区别是其运行时的动态性,它能让你在运行时为类添加方法或者詓除方法以及使用反射极大的方便了程序的扩展。

}

我要回帖

更多关于 多态ios下载 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信