1、#import和#include的区别,@class代表什么?答案:@class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import而#import比起#include的好处就是不会引起重复包含2、类变量的@protected,@private,@public声明各有什么含义答案:protected该类和所有的子类中的方法可以直接访问这样的变量,这是默认的。private—该类中的方法可以访问这样的变量,子类不可以。public—除了自己和子类中的方法外,也可以被其他类或者其他模块中的方法所访问。开放性最大。3、定义属性时,什么情况使用copy、assign、retain?答案:assign用于简单数据类型,如NSInteger,double,bool,retain和copy用于对象,copy用于当a指向一个对象,b也想指向同样的对象的时候,如果用assign,a如果释放,再调用b会crash,如果用copy的方式,a和b各自有自己的内存,就可以解决这个问题。retain会使计数器加一,也可以解决assign的问题。4、frame和bounds有什么不同?答案:frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)bounds指的是:该view在本身坐标系统中的位置和大小。(参照点是本身坐标系统)5、id、nil代表什么答案:id和void*并非完全一样。在上面的代码中,id是指向structobjc_object的一个指针,这个意思基本上是说,id是一个指向任何一个继承了Object(或者NSObject)类的对象。需要注意的是id是一个指针,所以你在使用id的时候不需要加星号。比如idfoo=nil定义了一个nil指针,这个指针指向NSObject的一个任意子类。而id*foo=nil则定义了一个指针,这个指针指向另一个指针,被指向的这个指针指向NSObject的一个子类。nil和C语言的NULL相同,在objc/objc.h中定义。nil表示一个Objctive-C对象,这个对象的指针指向空(没有东西就是空)。首字母大写的Nil和nil有一点不一样,Nil定义一个指向空的类(是Class,而不是对象)。6、id声明的对象有什么特性?答案:id是个很重要的类型,是个可以指向任何类型的指针或者可以理解为指向任何未知类型的指针。7、浅拷贝和深拷贝区别是什么答案:简单的来说就是,在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误8、类别(category)的作用?继承和类别在实现中有何区别?答案:category可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。 并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。 类别主要有3个作用: (1)将类的实现分散到多个不同文件或多个不同框架中。 (2)创建对私有方法的前向引用。 (3)向对象添加非正式协议。 继承可以增加,修改或者删除方法,并且可以增加属性。9、类别(category)和类扩展(extension)的区别答案:category和extensions的不同在于后者可以添加属性。另外后者添加的方法是必须要实现的。 extensions可以认为是一个私有的Category。10、Object-c的类可以多重继承么?可以实现多个接口么?重写一个类的方式用继承好答案:Objective-c只支持单继承,如果要实现多继承的话,可以通过类别和协议的方式来实现,cocoa中所有的类都是NSObject的子类,多继承在这里是用protocol委托代理来实现的。11、代理的作用?什么时候可以用代理答案:代理的目的是改变或传递控制链。允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。可以减少框架复杂度。另外一点,代理可以理解为java中的回调监听机制的一种类似。12、delegate和notification区别答案:Delegate:消息的发送者(sender)告知接收者(receiver)某个事件将要发生,delegate同意然然后发送者响应事件,delegate机制使得接收者可以改变发送者的行为。通常发送者和接收者的关系是直接的一对多的关系。Notification:消息的发送者告知接收者事件已经发生或者将要发送,仅此而已,接收者并不能反过来影响发送者的行为。通常发送者和接收者的关系是间接的多对多关系。13、UITableView的简单描述及功能介绍,如何实现一个简单的列表?答案:UITableView继承自UIScrollView,可以表现为Plain和Grouped两种风格UITableView有两个Delegate分别为:dataSource和delegatedataSource是UITableViewDataSource类型,主要为UITableView提供显示用的数据(UITableViewCell),指定UITableViewCell支持的编辑操作类型(insert,delete和reordering),并根据用户的操作进行相应的数据更新操作,如果数据没有更具操作进行正确的更新,可能会导致显示异常,甚至crush。delegate是UITableViewDelegate类型,主要提供一些可选的方法,用来控制tableView的选择、指定section的头和尾的显示以及协助完成cell的删除和排序等功能。14、tableView的重用机制?答案:查看UITableView头文件,会找到NSMutableArray*visiableCells,和NSMutableDictnery*reusableTableCells两个结构。visiableCells内保存当前显示的cells,reusableTableCells保存可重用的cells。TableView显示之初,reusableTableCells为空,那么tableViewdequeueReusableCellWithIdentifier:CellIdentifier返回nil。开始的cell都是通过[[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:CellIdentifier]来创建,而且cellForRowAtIndexPath只是调用最大显示cell数的次数。比如:有100条数据,iPhone一屏最多显示10个cell。程序最开始显示TableView的情况是:1.用[[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:CellIdentifier]创建10次cell,并给cell指定同样的重用标识(当然,可以为不同显示类型的cell指定不同的标识)。并且10个cell全部都加入到visiableCells数组,reusableTableCells为空。2.向下拖动tableView,当cell1完全移出屏幕,并且cell11(它也是alloc出来的,原因同上)完全显示出来的时候。cell11加入到visiableCells,cell1移出visiableCells,cell1加入到reusableTableCells。3.接着向下拖动tableView,因为reusableTableCells中已经有值,所以,当需要显示新的cell,cellForRowAtIndexPath再次被调用的时候,tableViewdequeueReusableCellWithIdentifier:CellIdentifier,返回cell1。cell1加入到visiableCells,cell1移出reusableTableCells;cell2移出visiableCells,cell2加入到reusableTableCells。之后再需要显示的Cell就可以正常重用了。15、怎么理解MVC,在Cocoa中MVC是怎么实现的?Model:代表你的应用程序是什么(不是怎么展现)Controller:控制你的Model怎么展现给用户(UI逻辑)View:Controller的奴隶。。。1Model,Controller,View相互通讯的规则:Controller可以直接和Model通信Controller也可以直接和View通信Model和View永远不能直接通信iOS中View和Controller的通信是透明和固定的,主要通过outlet和action实现View使用Delegate接口和Controller同步信息View不直接和数据通信,使用dataSource接口从Controller处获取数据View的delegate和dataSource一般就是ControllerController负责为View翻译和格式化Model的数据Model使用Notification&KVO的方式分发数据更新信息,Controller可以有选择的监听自己感兴趣的信息。View也可以监听广播信息,但一般不是Model发出的信息一个完整的App就是很多MVC的集合16、C和obj-c如何混用答案:1)obj-c的编译器处理后缀为m的文件时,可以识别obj-c和c的代码,处理mm文件可以识别obj-c,c,c++代码,但cpp文件必须只能用c/c++代码,而且cpp文件include的头文件中,也不能出现obj-c的代码,因为cpp只是cpp2)在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是问题3)在cpp中混用obj-c其实就是使用obj-c编写的模块是我们想要的。17、自动释放池是什么,如何工作答案:当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。1.ojc-c是通过一种referringcounting(引用计数)的方式来管理内存的,对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一,每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0,就会被系统销毁.2.NSAutoreleasePool就是用来做引用计数的管理工作的,这个东西一般不用你管的.3.autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一.18、对单例模式的理解答案:单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类19、什么是TCP连接的三次握手答案:第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前