是第一篇:java
1.Difference between shallow copy and deep copy?
浅复制和深复制的区别?
答案:浅层复制:只复制指向对象的指针,而不复制引用对象自己。
深层复制:复制引用对象自己。
意思就是说我有个A对象,复制一份后获得A_copy对象后,对于浅复制来讲,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象自己资源
仍是只有一份,那若是咱们对A_copy执行了修改操做,那么发现A引用的对象一样被修改,这其实违背了咱们复制拷贝的一个思想。深复制就好理解了,内存中存在了
两份独立对象自己。
用网上一哥们通俗的话将就是:
浅复制比如你和你的影子,你完蛋,你的影子也完蛋
深复制比如你和你的克隆人,你完蛋,你的克隆人还活着。ios
2.What is advantage of categories? What is difference between implementing a category and inheritance?
类别的做用?继承和类别在实现中有何区别?
答案:category 能够在不获悉,不改变原来代码的状况下往里面添加新的方法,只能添加,不能删除修改。
而且若是类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,由于类别具备更高的优先级。
类别主要有3个做用:
(1)将类的实现分散到多个不一样文件或多个不一样框架中。
(2)建立对私有方法的前向引用。
(3)向对象添加非正式协议。
继承能够增长,修改或者删除方法,而且能够增长属性。c++
3.Difference between categories and extensions?
类别和类扩展的区别。
答案:category和extensions的不一样在于 后者能够添加属性。另外后者添加的方法是必需要实现的。
extensions能够认为是一个私有的Category。程序员
4.Difference between protocol in objective c and interfaces in java?
obc中的协议和java中的接口概念有何不一样?
答案:OBC中的代理有2层含义,官方定义为 formal和informal protocol。前者和Java接口同样。
informal protocol中的方法属于设计模式考虑范畴,不是必须实现的,可是若是有实现,就会改变类的属性。
其实关于正式协议,类别和非正式协议我很早前学习的时候大体看过,也写在了学习教程里
“非正式协议概念其实就是类别的另外一种表达方式“这里有一些你可能但愿实现的方法,你可使用他们更好的完成工做”。
这个意思是,这些是可选的。好比我门要一个更好的方法,咱们就会申明一个这样的类别去实现。而后你在后期能够直接使用这些更好的方法。
这么看,总以为类别这玩意儿有点像协议的可选协议。"
如今来看,其实protocal已经开始对二者都统一和规范起来操做,由于资料中说“非正式协议使用interface修饰“,
如今咱们看到协议中两个修饰词:“必须实现(@requied)”和“可选实现(@optional)”。objective-c
5.What are KVO and KVC?
答案:KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。sql
KVC是KeyValueCoding的简称,它是一种能够直接经过字符串的名字(key)来访问类属性的机制。而不是经过调用Setter、Getter方法访问。数据库
当使用KVO、Core Data、CocoaBindings、AppleScript(Mac支持)时,KVC是关键技术。编程
6.What is purpose of delegates?
代理的做用?
答案:代理的目的是改变或传递控制链。容许一个类在某些特定时刻通知到其余类,而不须要获取到那些类的指针。能够减小框架复杂度。
另一点,代理能够理解为java中的回调监听机制的一种相似。设计模式
7.What are mutable and immutable types in Objective C?
obc中可修改和不能够修改类型。
答案:可修改不可修改的集合类。这个我我的简单理解就是可动态添加修改和不可动态添加修改同样。
好比NSArray和NSMutableArray。前者在初始化后的内存控件就是固定不可变的,后者能够添加等,能够动态申请新的内存空间。数组
8.When we call objective c is runtime language what does it mean?
咱们说的obc是动态运行时语言是什么意思?
答案:多态。 主要是将数据类型的肯定由编译时,推迟到了运行时。
这个问题其实浅涉及到两个概念,运行时和多态。
简单来讲,运行时机制使咱们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。
多态:不一样对象以本身的方式响应相同的消息的能力叫作多态。意思就是假设生物类(life)都用有一个相同的方法-eat;
那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,可是调用是咱们只需调用各自的eat方法。
也就是不一样的对象以本身的方式响应了相同的消息(响应了eat这个选择器)。
所以也能够说,运行时机制是多态的基础?~~~
9.what is difference between NSNotification and protocol?
通知和协议的不一样之处?
答案:协议有控制链(has-a)的关系,通知没有。
首先我一开始也不太明白,什么叫控制链(专业术语了~)。可是简单分析下通知和代理的行为模式,咱们大体能够有本身的理解
简单来讲,通知的话,它能够一对多,一条消息能够发送给多个消息接受者。
代理按咱们的理解,到不是直接说不能一对多,好比咱们知道的明星经济代理人,不少时候一个经济人负责好几个明星的事务。
只是对于不一样明星间,代理的事物对象都是不同的,一一对应,不可能说明天要处理A明星要一个发布会,代理人发出处理发布会的消息后,别称B的
发布会了。可是通知就不同,他只关心发出通知,而不关心多少接收到感兴趣要处理。
所以控制链(has-a从英语单词大体能够看出,单一拥有和可控制的对应关系。
10.What is push notification?
什么是推送消息?
答案:
一、 [Client App]注册消息推送;
二、 [Client App]跟[APNS Service]要deviceToken, Client App接收deviceToken;
三、 [Client App]将deviceToken发送给[Provider]Push服务端程序;
四、 当Push服务端程序知足发送消息条件了,[Provider]向[APNS Service]发送消息;
五、 [APNS Service]将消息发送给[Client App].
11.Polymorphism?
关于多态性
答案:多态,子类指针能够赋值给父类。
这个题目其实能够出到一切面向对象语言中,
所以关于多态,继承和封装基本最好都有个自我意识的理解,也并不是必定要把书上资料上写的能背出来。
最重要的是转化成自我理解。
12.Singleton?
对于单例的理解
答案:单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,并且自行实例化并向整个系统提供这个实例。这个类称为单例类。
显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行建立这个实例;三是它必须自行向整个系统提供这个实例。
13.What is responder chain?
说说响应链
答案:
首先要明确的是:在IOS中,有响应者链对事件进行响应,全部的响应类都是UIResponder的子类,响应者链是一个由不一样对象组成的层次结构,其中的每一个对象将依次得到响应事件消息的机会。
响应链的过程:当事件发生的时候,响应链首先被发送给第一个响应者(每每是事件发生的视图,也就是用户触摸屏幕的地方)。事件将沿着响应者链一直向下传递,知道被接受并做出处理。通常来讲,第一响应这是个视图对象或者其子类,当其被触摸后事件就交由它处理,若是他不处理,事件就会被传递给视图控制器对象UIViewController(若是存在),而后是它的父视图对象(superview),以此类推知道顶层视图。接下来会沿着顶层视图(top view)到窗口(UIwindow 对象) 再到程序的(UIApplication对象),若是整个过程都没有响应这个事件,则该事件被丢弃,通常状况下,在响应链中只要有对象处理事件,事件就会被传递。
典型的响应路线图如:
First Responser --> The Window -->The Applicationn --> App Delegate
正常的响应者链流程常常被委托打断,一个对象可能将响应工做委托给另外一个对象来完成(一般是视图控制器viewcontroller)。
14.Difference between frame and bounds?
frame和bounds有什么不一样?
答案:frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)
bounds指的是:该view在自己坐标系统中 的位置和大小。(参照点是自己坐标系统)
15.Difference between method and selector?
方法和选择器有何不一样?
答案:selector是一个方法的名字,method是一个组合体,包含了名字和实现.
详情能够看apple文档。
16.Is there any garbage collection mechanism in Objective C.?
OBC的垃圾回收机制?
答案: OBC2.0有Garbage collection,可是iOS平台不提供。
通常咱们了解的objective-c对于内存管理都是手动操做的,可是也有自动释放池。
可是差了大部分资料,貌似不要和arc机制搞混就行了。
求更多~~
17.NSOperation queue?
答案:存放NSOperation的集合类。
操做和操做队列,基本能够当作java中的线程和线程池的概念。用于处理ios多线程开发的问题。
网上部分资料提到一点是,虽然是queue,可是却并非带有队列的概念,放入的操做并不是是按照严格的先进现出。
这边又有个疑点是,对于队列来讲,先进先出的概念是Afunc添加进队列,Bfunc紧跟着也进入队列,Afunc先执行这个是必然的,
可是Bfunc是等Afunc彻底操做完之后,B才开始启动而且执行,所以队列的概念离乱上有点违背了多线程处理这个概念。
可是转念一想其实能够参考银行的取票和叫号系统。
所以对于A比B先排队取票可是B率先执行完操做,咱们亦然能够感性认为这仍是一个队列。
可是后来看到一票关于这操做队列话题的文章,其中有一句提到
“由于两个操做提交的时间间隔很近,线程池中的线程,谁先启动是不定的。”
瞬间以为这个queue名字有点忽悠人了,还不如pool~
综合一点,咱们知道他能够比较大的用处在于能够帮组多线程编程就行了。
18.What is lazy loading?
答案:懒汉模式,只在用到的时候才去初始化。
也能够理解成延时加载。
我以为最好也最简单的一个列子就是tableView中图片的加载显示了。
一个延时载,避免内存太高,一个异步加载,避免线程堵塞。
19.Can we use two tableview controllers on one viewcontroller?
是否在一个视图控制器中嵌入两个tableview控制器?
答案:一个视图控制只提供了一个View视图,理论上一个tableViewController也不能放吧,
只能说能够嵌入一个tableview视图。固然,题目自己也有歧义,若是不是咱们定性思惟认为的UIViewController,
而是宏观的表示视图控制者,那咱们却是能够把其当作一个视图控制者,它能够控制多个视图控制器,好比TabbarController
那样的感受。
20.Can we use one tableview with two different datasources? How you will achieve this?
一个tableView是否能够关联两个不一样的数据源?你会怎么处理?
答案:判断是哪一个section 对于不一样的section调用不一样的数据源
21.Object-c的类能够多重继承么?能够实现多个接口么?重写一个类的方式用继承好仍是分类好?为何?
Object-c的类不能够多重继承;能够实现多个接口,经过实现多个接口能够完成C++的多重继承;Category是类别,通常状况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其余类与原有类的关系。
22.#import 跟#include 又什么区别 #import<> 跟 #import""又什么区别?
答案:@class通常用于头文件中须要声明该类的某个实例变量的时候用到,在m文 件中仍是须要使用#import而#import比起#include的好处就是不会引发交叉编译。
24.id 声明的对象有什么特性?
答案:id是个很重要的类型,是个能够指向任何类型的指针或者能够理解为指向任何未知类型的指针。
25.MVC是什么?有什么特性?为何在iPhone上被普遍运用?
答案:MVC设计模式考虑三种对象:模型对象、视图对象、和控制器对象。模型对象表明 特别的知识和专业技能,它们负责保有应用程序的数据和定义操做数据的逻辑。视图对象知道如何显示应用程序的模型数据,并且可能容许用户对其进行编辑。控制 器对象是应用程序的视图对象和模型对象之间的协调者。
26.对于语句NSString* testObject = [[NSData alloc] init];testObject 在编译时和运行时分别是什么类型的对象?
答案:编译时是NSString对象,运行时是NSData对象
31.属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么做用,在那种状况下用?
readwrite 是可读可写特性;须要生成getter方法和setter方法时
readonly 是只读特性 只会生成getter方法 不会生成setter方法 ;不但愿属性在类外改变
assign 是赋值特性,setter方法将传入参数赋值给实例变量;简单赋值,不更改索引计数,对基础数据类型 (NSInteger)和C数据类型
retain 表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1;对其余NSObject和其子类
copy 表示赋值特性,setter方法将传入对象复制一份;须要彻底一份新的变量时。对NSString
nonatomic 非原子操做,决定编译器生成的setter getter是不是原子操做,atomic表示多线程安全,通常使用nonatomic
35.自动释放池跟GC(垃圾回收)有什么区别?iPhone上有GC么?[pool release] 和[pool drain]有什么区别?
iPhone上没有GC。iPhone开发的时候没有垃圾回收机制。
在垃圾回收环境中,release是一个空操做。所以,NSAutoreleasePool提供了drain方法,在引用计数环境中,该方法的做用等同于调用release,但在垃圾回收环境中,它会触发垃圾回收(若是自上次垃圾回收以来分配的内存大于当前的阈值)。所以,在一般状况下,您应该使用drain而不是release来销毁自动释放池。
36.
for(int index = 0; index < 20; index ++){
NSString *tempStr = @”tempStr”;
NSLog(tempStr);
NSNumber *tempNumber = [NSNumber numberWithInt:2];
NSLog(tempNumber);
}
这段代码有什么问题.?会不会形成内存泄露(多线程)?在内存紧张的设备上作大循环时自动释放池是写在循环内好仍是循环外好?为何?
答:tempStr tempNumber都没有release。会。
37.内存管理的几条原则时什么?按照默认法则.那些关键字生成的对象须要手动释放?在和property结合的时候怎样有效的避免内存泄露?
谁申请,谁释放
遵循Cocoa Touch的使用原则;
内存管理主要要避免“过早释放”和“内存泄漏”,对于“过早释放”须要注意@property设置特性时,必定要用对特性关键字,对于“内存泄漏”,一 定要申请了要负责释放,要细心。
关键字alloc 或new 生成的对象须要手动释放;
设置正确的property属性,对于retain须要在合适的地方释放,
38.在一个对象释放前.若是他被加到了notificationCenter 中.不在notificationcenter中remove这个对象可能会出现什么问题?
答:对象被release,出现野指针。
39.怎样实现一个 singleton的类.给出思路。
40.什么是序列化或者Acrchiving,能够用来作什么,怎样与copy结合,原理是什么?.
面向对象的程序在运行的时候会建立一个复杂的对象图,常常要以二进制的方法序列化这个对象图,这个过程叫作Archiving. 二进制流能够经过网络或写入文件中(来源于某教材的一段话)
本人的理解是当你于写数据须要本地存储时,即将你的数据写到硬盘上的时候,你就必须对他进行序列化,转换成二进制文件,从而便于在磁盘上的读写,同理在取出的时候必须将其在反序列化,这样才能将数据读出来,就比如加密和揭秘的过程。
41. 线程与进程的区别和联系?
答案: 进程和线程都是由操做系统所体会的程序运行的基本 单元,系统利用该基本单元实现系统对应用的并发性。
程和线程的主要差异在于它们是不一样的操做系统资源 管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不一样执行路径。线程有本身的堆栈和局部变 量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,因此多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一 些。但对于一些要求同时进行而且又要共享某些变量的并发操做,只能用线程,不能用进程。
42.在iphone上有两件事情要作,请问是在一个线程里按顺序作效率高仍是两个线程里作效率高?为何?
答:在两个线程里高,程序能够并发执行。
43.runloop是什么?在主线程中的某个函数里调用了异步函数,怎么样block当前线程,且还能响应当前线程的timer事件,touch事件等.
Run loop就像它的名字同样,是你thread中的一个循环并对收到的事件进行处理。你的代码提供控制语句用来对run loop进行执行——换句话说:你的代码提供while或for循环来驱动run loop。在你的循环中,你使用run loop对象来“运行”事件处理代码。事件处理代码主要进行接收事件并调用事件处理函数。
44.ios平台怎么作数据的持久化?coredata和sqlite有无必然联系?coredata是一个关系型数据库吗?
iOS中能够有四种持久化数据的方式: 属性列表、对象归档、SQLite3和Core Data;core data可使你以图形界面的方式快速的定义app的数据模型,同时在你的代码中容易获取到它。core data提供了基础结构去处理经常使用的功能,例如保存,恢复,撤销和重作,容许你在app中继续建立新的任务。在使用core data的时候,你不用安装额外的数据库系统,由于core data使用内置的sqlite数据库。core data将你app的模型层放入到一组定义在内存中的数据对象。core data会追踪这些对象的改变,同时能够根据须要作相反的改变,例如用户执行撤销命令。当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支持对1、对多的关系。
45.阐述一个nil对象从interface bulider产生,到载入程序运行空间,最后被释放时所经历的生命周期.
49.unix上进程怎么通讯?
UNIX主要支持三种通讯方式:
1. 基本通讯:主要用来协调进程间的同步和互斥
(1)锁文件通讯
通讯的双方经过查找特定目录下特定类型的文件(称锁文件)来完成进程间 对临界资源访问时的互斥;例如进程p1访问一个临界资源,首先查看是否有一个特定类型文件,如有,则等待一段时间再查找锁文件。
(2)记录锁文件
2. 管道通讯:适应大批量的数据传递
3. IPC :适应大批量的数据传递
50.timer的间隔周期准吗?为何?怎样实现一个精准的timer?
51.UIscrollVew用到了什么设计模式?还能再foundation库中找到相似的吗?(答案众多,不知道哪一个是对的~~)
模板(Template)模式,全部datasource和delegate接口都是模板模式的典型应用,
组合模式composition,全部的containerview都用了这个模式
观察者模式observer,全部的UIResponder都用了这个模式。
52若是要开发一个相似eclipse的软件,支持插件结构。且开放给第三方开发。你会怎样去设计它?(大概思路)
53. main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
答:2,5
*(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2.5 ,&a+1不是首地址+1,系统会认为加一个a数组的偏 移,是偏移了一个数组的大小(本例是5个int,int *ptr=(int *)(&a+1); 则ptr实际 是&(a[5]),也就是a+5 缘由以下:
&a是数组指针,其类型为 int (*)[5]; 而指针加1要根据指针类型加上必定的值,不一样类型的指针+1以后增长的大小不一样。a是长度为5的int数组指针,因此要加 5*sizeof(int)因此ptr实际是a[5],可是prt与(&a+1)类型是不同的(这点很重要),因此prt-1只会减去sizeof(int*),a,&a的地址是同样的,但意思不同,a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5].
54. 如下为Windows NT下的32位C++程序,请计算sizeof的值 voidFunc ( char str[100] ) { sizeof( str ) =? } void *p = malloc( 100 ); sizeof ( p ) = ?
答案:这题 很常见了,Func( char str[100] )函数中数组名做为函数形参时,在函数体内,数组名失去了自己的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,能够做自增、自减等操做,能够被修改。Windows NT 32位平台下,指针的长度(占用内存的大小)为4字节,故sizeof( str ) 、sizeof( p ) 都为4。
56.列举几种进程的同步机制,并比较其优缺点。
答案: 原子操做信号量机制 自旋锁 管程,会合,分布式系统
进程之间通讯的途径
答案:共享存储系统消息传递系统管道:以文件系统为基础
进程死锁的缘由
答案:资源竞争及进程推动顺序非法
死锁的4个必要条 件
答案:互斥、请求保持、不可剥夺、环路
死锁的处理
答案:鸵鸟策略、预防策略、避免策略、检测与解除死锁
57.堆和栈的区别
管理方式:对于栈来说,是由编译器自动管理,无需咱们手工控制;对于堆来讲,释放工做由程序员控制,容易产生memory leak。
申请大小: 栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就肯定的常数),若是申请的空间超过栈的剩余空间时,将提示overflow。所以,能从栈得到的空间较小。 堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是因为系统是用链表来存储的空闲内存地址的,天然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。因而可知,堆得到的空间比较灵活,也比较大。
碎片问题:对于堆来说,频繁的new/delete势必会形成内存空间的不连续,从而形成大量的碎片,使程序效率下降。对于栈来说,则不会存在这个 问题,由于栈是先进后出的队列,他们是如此的一一对应,以致于永远都不可能有一个内存块从栈中间弹出
分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,好比局部变量的分配。动态分配由alloca函数进行分配,可是栈的动态分配和堆是不一样的,他的动态分配是由编译器进行释放,无需咱们手工实现。
分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。
58.什么是键-值,键路径是什么?
模型的性质是经过一个简单的键(一般是个字符串)来指定的。视图和控制器经过键来查找相应的属性值。在一个给定的实体中,同一个属性的全部值具备相同的数据类型。键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制。
键路径是一个由用点做分隔符的键组成的字符串,用于指定一个链接在一块儿的对象性质序列。第一个键的 性质是由先前的性质决定的,接下来每一个键的值也是相对于其前面的性质。键路径使您能够以独立于模型 实现的方式指定相关 对象的性质。经过键路径,您能够指定对象图中的一个任意深度的路径,使其指向相 关对象的特定属性。
59.c和obj-c如何混用
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.
60.目标-动做机制
目标是动做消息的接收者。一个控件,或者更为常见的是它的单元,以插座变量(参见"插座变量"部分) 的形式保有其动做消息的目标。
动做是控件发送给目标的消息,或者从目标的角度看,它是目标为了响应动做而实现的方法。
程序须要某些机制来进行事件和指令的翻译。这个机制就是目标-动做机制。
-(void)addTarget:(id)target action:(SEL) forControlEvents:(UIControlEvents)controlEvents
61.cocoatouch框架
iPhoneOS 应用程序的基础Cocoa Touch 框架重用了许多 Mac 系统的成熟模式,可是它更多地专一于触摸的接口和优化。UIKit 为您提供了在 iPhone OS 上实现图形,事件驱动程序的基本工具,其创建在和 Mac OS X 中同样的 Foundation 框架上,包括文件处理,网络,字符串操做等。
CocoaTouch 具备和 iPhone 用户接口一致的特殊设计。有了 UIKit,您可使用 iPhone OS 上的独特的图形接口控件,按钮,以及全屏视图的功能,您还可使用加速仪和多点触摸手势来控制您的应用。
各色俱全的框架 除了UIKit 外,Cocoa Touch 包含了建立世界一流iPhone 应用程序须要的全部框架,从三维图形,到专业音效,甚至提供设备访问 API 以控制摄像头,或经过 GPS 获知当前位置。Cocoa Touch 既包含只须要几行代码就能够完成所有任务的强大的 Objective-C 框架,也在须要时提供基础的 C 语言 API 来直接访问系统。这些框架包括:
CoreAnimation
经过 CoreAnimation,您就能够经过一个基于组合独立图层的简单的编程模型来建立丰富的用户体验。
CoreAudio
CoreAudio 是播放,处理和录制音频的专业技术,可以轻松为您的应用程序添增强大的音频功能。
CoreData
提供了一个面向对象的数据管理解决方案,它易于使用和理解,甚至可处理任何应用或大或小的数据模型。
功能列表:框架分类
下面是 CocoaTouch 中一小部分可用的框架:
• 音频和视频
• Core Audio
• OpenAL
• Media Library
• AV Foundation
• 数据管理
• Core Data
• SQLite
• 图形和动画
• Core Animation
• OpenGL ES
• Quartz 2D
• 网络/li>
• Bonjour
• WebKit
• BSD Sockets
• 用户应用
• Address Book
• Core Location
• Map Kit
• Store Kit
62.objc的内存管理
若是您经过分配和初始化(好比[[MyClass alloc] init])的方式来建立对象,您就拥 有这个对象,须要负责该对象的释放。这个规则在使用NSObject的便利方法new 时也一样适用.
若是您拷贝一个对象,您也拥有拷贝获得的对象,须要负责该对象的释放.
若是您保持一个对象,您就部分拥有这个对象,须要在再也不使用时释放该对象。
若是您从其它对象那里接收到一个对象,则您不拥有该对象,也不该该释放它(这个规则有少数 的例外,在参考文档中有显式的说明)。
63.自动释放池是什么,如何工做
当您向一个对象发送一个autorelease消息时,Cocoa就会将该对 象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,所以自动释放池定义的做用域内的其它对象能够向它发送消息。当程序执行到做用域结束的位置时,自动释放池就会被释放,池中的全部对象也就被释放。
1. ojc-c 是经过一种"referringcounting"(引用计数)的方式来管理内存的, 对象在开始分配内存(alloc)的时候引用计数为一,之后每当碰到有copy,retain的时候引用计数都会加一, 每当碰到release和autorelease的时候引用计数就会减一,若是此对象的计数变为了0, 就会被系统销毁. 2. NSAutoreleasePool 就是用来作引用计数的管理工做的,这个东西通常不用你管的. 3. autorelease和release没什么区别,只是引用计数减一的时机不一样而已,autorelease会在对象的使用真正结束的时候才作引用计数减一.
64.类工厂方法是什么
类工厂方法的实现是为了向客户提供方便,它们将分配和初始化合在一个步骤中, 返回被建立的对象,并 进行自动释放处理。这些方法的形式是+ (type)className...(其中 className不包括任何前缀)。
工厂方法可能不只仅为了方便使用。它们不但能够将分配和初始化合在一块儿,还能够为初始化过程提供对 象的分配信息。
类工厂方法的另外一个目的是使类(好比NSWorkspace)提供单件实例。虽 然init...方法能够确认一 个类在每次程序运行过程只存在一个实例,但它须要首先分配一个“生的”实例,而后还必须释放该实例。 工厂 方法则能够避免为可能没有用的对象盲目分配内存。
65.单件实例是什么
Foundation和Application Kit 框架中的一些类只容许建立单件对象,即这些类在当前进程中的惟一实例。举例来讲,NSFileManager和NSWorkspace 类在使用时都是基于进程进行单件对象的实例化。当向这些类请求实例的时候,它们会向您传递单一实例的一个引用,若是该实例还不存在,则首先进行实例的分配和初始化。 单件对象充当控制中心的角色,负责指引或协调类的各类服务。若是类在概念上只有一个实例(好比 NSWorkspace),就应该产生一个单件实例,而不是多个实例;若是未来某一天可能有多个实例,您可 以使用单件实例机制,而不是工厂方法或函数。
66.动态绑定—在运行时肯定要调用的方法
动态绑定将调用方法的肯定也推迟到运行时。在编译时,方法的调用并不和代码绑定在一块儿,只有在消实发送出来以后,才肯定被调用的代码。经过动态类型和动态绑定技术,您的代码每次执行均可以获得不一样的结果。运行时因子负责肯定消息的接 收者和被调用的方法。运行时的消息分发机制为动态绑定提供支持。当您向一个动态类型肯定了的对象发送消息时,运行环境系统会经过接收者的isa指针定位对象的类,并以此为起点肯定被调用的方法,方法和消息是动态绑定的。并且,您没必要在Objective-C 代码中作任何工做,就能够自动获取动态绑定的好处。您在每次发送消息时,
特别是当消息的接收者是动态类型已经肯定的对象时,动态绑定就会例行而 透明地发生。
67.obj-c的优缺点
objc优势: 1)Cateogies 2) Posing 3) 动态识别 4) 指标计算 5)弹性讯息传递 6) 不是一个过分复杂的 C 衍生语言 7) Objective-C 与 C++ 可混合编程
缺点: 1) 不支援命名空間 2) 不支持运算符重载
3) 不支持多重继承
4) 使用动态运行时类型,全部的方法都是函数调用,因此不少编译时优化方法都用不到。(如内联函数等),性能低劣。
68.readwrite,readonly,assign,retain,copy,nonatomic 属性的做用?
@property是 一个属性访问声明,扩号内支持如下几个属性: 1,getter=getterName,setter=setterName,设置setter与 getter的方法名 2,readwrite,readonly,设置可供访问级别 2,assign,setter方法直接赋值,不进行 任何retain操做,为了解决原类型与环循引用问题 3,retain,setter方法对参数进行release旧值再retain新值,全部 实现都是这个顺序(CC上有相关资料) 4,copy,setter方法进行Copy操做,与retain处理流程同样,先旧值release,再 Copy出新的对象,retainCount为1。这是为了减小对上下文的依赖而引入的机制。 5,nonatomic,非原子性访问,不加同步, 多线程并发访问会提升性能。注意,若是不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级(我是这么理解的…)。
69.ViewController的 didReceiveMemoryWarning 是在何时被调用的?(87题)
答:已经收到内存警告
70.谈谈你对ARC 的认识和理解?
答:
Automatic Reference Counting,自动引用计数,即ARC,能够说是WWDC2011和iOS5所引入的最大的变革和最激动人心的变化。ARC是新的LLVM 3.0编译器的一项特性,使用ARC,能够说一举解决了广大iOS开发者所憎恨的手动内存管理的麻烦。
在工程中使用ARC很是简单:只须要像往常那样编写代码,只不过永远不写retain
,release
和autorelease
三个关键字就好~这是ARC的基本原则。当ARC开启时,编译器将自动在代码合适的地方插入retain
, release
和autorelease
,而做为开发者,彻底不须要担忧编译器会作错(除非开发者本身错用ARC了)。好了,ARC至关简单吧~到此为止,本教程结束。
71. ObjC中,与alloc语义相反的方法是dealloc仍是release?与retain语义相反的方法是dealloc仍是release,为何?须要与alloc配对使用的方法是dealloc仍是release,为何?
alloc与dealloc语意相反,alloc是建立变量,dealloc是释放变量。 retain 对应release,retain 保留一个对象。调用以后,变量的计数加1。或许不是很明显,在这有例为证:
- (void)setName : (NSString*) name {
[name retain];
[myname release];
myname = name; }
咱们来解释一下:设想,用户在调用这个函数的时候,他注意了内存的管理,因此他当心的写了以下代码:
NSString* newname = [[NSString alloc] initWithString: @"John"];
[aClass setName: newname];
[newname release];
咱们来看一看newname的计数是怎么变化的。首先,它被alloc,count = 1; 而后,在setName中,它被retain,count = 2; 最后,用户本身释放newname,count= 1,myname指向了newname。这也解释了为何须要调用[myname release]。咱们须要在给myname赋新值的时候,释放掉之前老的变量。retain 以后直接dealloc对象计数器没有释放。alloc 须要与release配对使用,由于alloc 这个函数调用以后,变量的计数加1。因此在调用alloc 以后,必定要调用对应的release。另外,在release一个变量以后,他的值仍然有效,因此最好是后面紧接着再var = nil。
73. 这段代码有什么问题:
@implementation Person
- (void)setAge:(int)newAge {
self.age = newAge;
}
@end
74. 什么是retaincount?
答:对象引用计数
75. 如下每行代码执行后,person对象的retain count分别是多少
Person *person = [[Person alloc] init]; 1
[person retain]; 2
[person release]; 1
[person release]; 0
76. 为何不少内置类如UITableViewController的delegate属性都是assign而不是retain的?
循环引用
全部的引用计数系统,都存在循环应用的问题。例以下面的引用关系:
• 对象a建立并引用到了对象b.
• 对象b建立并引用到了对象c.
• 对象c建立并引用到了对象b.
这时候b和c的引用计数分别是2和1。当a再也不使用b,调用release释放对b的全部权,由于c还引用了b,因此b的引用计数为1,b不会被释放。b不释放,c的引用计数就是1,c也不会被释放。今后,b和c永远留在内存中。
这种状况,必须打断循环引用,经过其余规则来维护引用关系。好比,咱们常见的delegate每每是assign方式的属性而不是retain方式 的属性,赋值不会增长引用计数,就是为了防止delegation两端产生没必要要的循环引用。若是一个UITableViewController对象a经过retain获取了UITableView对象b的全部权,这个UITableView对象b的delegate又是a, 若是这个delegate是retain方式的,那基本上就没有机会释放这两个对象了。本身在设计使用delegate模式时,也要注意这点。
77. 定义属性时,什么状况使用copy,assign,和retain?
assign用于简单数据类型,如NSInteger,double,bool,retain和copy用户对象,copy用于当 a指向一个对象,b也想指向一样的对象的时候,若是用assign,a若是释放,再调用b会crash,若是用copy 的方式,a和b各自有本身的内存,就能够解决这个问题。retain 会使计数器加一,也能够解决assign的问题。另外:atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操做。在多线程环境下,原子操做是必要的,不然有可能引发错误的结果。加了atomic,setter函数会变成下面这样:
if(property != newValue) { [propertyrelease]; property = [newValueretain]; }
78. autorelease的对象是在何时被release的?
答:autorelease实际上只是把对release的调用延迟了,对于每个Autorelease,系统只是把该Object放入了当前的Autoreleasepool中,当该pool被释放时,该pool中的全部Object会被调用Release。对于每个Runloop,系统会隐式建立一个Autoreleasepool,这样全部的releasepool会构成一个象CallStack同样的一个栈式结构,在每个Runloop结束时,当前栈顶的Autoreleasepool会被销毁,这样这个pool里的每一个Object(就是autorelease的对象)会被release。那什么是一个Runloop呢?一个UI事件,Timer call,delegate call, 都会是一个新的Runloop。那什么是一个Runloop呢?一个UI事件,Timer call,delegate call, 都会是一个新的Runloop。
81. Objective C中的protocal是什么?
@protocal obj里面的协议就如同java里面的interface。
82. Objective C中的selector 是什么?
你能够理解 @selector()就是取类方法的编号,他的行为基本能够等同C语言的中函数指针,只不过C语言中,能够把函数名直接赋给一个函数指针,而Objective-C的类不能直接应用函数指针,这样只能作一个@selector语法来取.它的结果是一个SEL类型。这个类型本质是类方法的编号(函数地址)。
83. Objective C中的category是什么?
Objective-C提供了一个很是灵活的类(Class)扩展机制-类别(Category)。类别用于对一个已经存在的类添加方法(Methods)。你只须要知道这个类的公开接口,不须要知道类的源代码。须要注意的是,类别不能为已存在的类添加实例变量(Instance Variables)。
子类(subclassing)是进行类扩展的另外一种经常使用方法。与子类相比,类别最主要的优势是:系统中已经存在的类能够不需修改就可以使用类别的扩展功能。
类别的第二大优势是实现了功能的局部化封装。类别定义能够放在一个已存在的类(类A)的定义文件中(.h)。这意味着这个类别只有在类A被引用的前提下才会被外部看到。若是另外一个类(类B)不须要用到类A的功能(没有包含类A的.h文件),也就不会看到依附类A存在的类别。iOS SDK中普遍运用这种类别定义法来封装功能。
84. 什么是Notification?何时用delegate,何时用Notification?
观察者模式,controller向defaultNotificationCenter添加本身的notification,其余类注册这个notification就能够收到通知,这些类能够在收到通知时作本身的操做(多观察者默认随机顺序发通知给观察者们,并且每一个观察者都要等当前的某个观察者的操做作完才能轮到他来操做,能够用NotificationQueue的方式安排观察者的反应顺序,也能够在添加观察者中设定反映时间,取消观察须要在viewDidUnload跟dealloc中都要注销)。
delegate针对one-to-one关系,而且reciever能够返回值给sender,notification能够针对one-to-one/many/none,reciever没法返回值给sender.因此,delegate用于sender但愿接受到reciever的某个功能反馈值,
notification用于通知多个object某个事件。
86. ViewController 的 loadView,viewDidLoad, viewDidUnload 分别是在何时调用的?在自定义ViewController的时候这几个函数里面应该作什么工做?
答:viewDidLoad在view 从nib文件初始化时调用,loadView在controller的view为nil时调用。此方法在编程实现view时调用,view 控制器默认会注册memory warning notification,当view controller的任何view 没有用的时候,viewDidUnload会被调用,在这里实现将retain 的view release,若是是retain的IBOutlet view 属性则不要在这里release,IBOutlet会负责release 。
87. ViewController 的didReceiveMemoryWarning 是在何时被调用的?UIViewController类中didReceiveMemoryWarning默认的操做是什么?
答:默认调用[superdidReceiveMemoryWarning]
88. UITableViewController 中,建立UITableViewCell时,initWithSytle:resuseIdentifier中,reuseIdentifier有什么用?简述UITableViewCell的复用原理.
复用队列的元素增长:只有在cell被滑动出界面的时候,此cell才会被加入到复用队列中。每次在建立cell的时候,程序会首先经过调用dequeueReusableCellWithIdentifier:cellType方法,到复用队列中去寻找标示符为“cellType”的cell,若是找不到,返回nil,而后程序去经过调用[[[UITableViewCell alloc]initWithStyle:style reuseIdentifier:cellType] autorelease]来建立标示符为“cellType”的cell。
89. UIView 和CALayer 有什么区别?
二者最大的区别是,图层不会直接渲染到屏幕上。
90. 以 UIView 类animateWithDuration:animations: 为例,简述UIView动画原理。