您的位置:首页 > 职场人生

ios面试题整理

2014-05-07 14:39 295 查看
1、请手工书写@property(nonatomic,retain)*name;的get和set方法

getter

- (Example *)name { return _name; }

setter

-(void)setName:(Example *)aName

{

if (name != aName)

{

[name release];

name = [aName retain];

}

}

2、请描述object -c内存管理机制、以及一般原则.

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

2)每retain一次会使引用系数就加1,相应地要在适当位置release

内存管理原则

1. 谁创建,谁释放(“谁污染,谁治理”)。如果你通过alloc、new或者(mutable)copy来创建一个对象,那么你必须调用release或autorelease。或句话说,不是你创建的,就不用你去释放

2. 一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease(autorelease是延迟释放内存,不用你自己去手动释放,系统会知道在什么时候该去释放掉它。)

3. 谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release

3、nil和NULL的区别?

答:nil是一个对象,而NULL是一个值

4、如何判断一个对象是否属于某个类?

respondsToSelector ,performSelector,conformstoProrocol,isKindofClass,isMemberofClass

5、object-c如何实现私有方法?

答:在object-c中没有私有方法,只有静态方法和实力方法.但是可以用@private修饰私有变量.用.m文件中使用catogory来实现私有方法.

6、BOOL与bool区别?

BOOL 只是一个宏,不是基本的数据类型,BOOL实际上=int,占4个字节空间。

bool 是C的基础数据类型,占用1个字节。

对于BOOL类型,当值为1时为真,即TRUE;当值为0时为假,即FALSE;

FALSE和TRUE都是宏。

对于bool类型,值只要不是0就是为真,即true;当值为0时为假,即false

7、用NSLog函数输出一个浮点类型,结果四舍五入,并保留以为小数.

NSLog(@”%.1f”,(NSNumber *)[@”48.79”, doublueValue])

8、用object-c或者c语言写一个方法判断20120101(阶乘)在十进制 、二进制下分别为几位数?

9、用c语言写一个函数判断两个链表(单链表不存在环)是否相交?

bool IsExitsLoop(slist * head){ slist * slow = head , * fast = head; while (fast && fast -> next)

{

slow = slow -> next;fast = fast -> next -> next;if ( slow == fast ) break ;

}

return ! (fast == NULL || fast -> next == NULL);}

11、关键字const有什么含意?

答:结论:

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

如果你曾花很多时间清理其它人留下的垃圾,

你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)

通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。

合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug 的出现。(1)欲阻止一个变量被改变,可以使用const 关键字。在定义该const 变量时,通常需要对它进行初始化,因为以后就没有(2指针来说,可以指定指针本身为const也可以指定指针所指的数据为nst,或二者同时指定为const;(3)在一个函数声明中,const 可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;(4)对于类的成员函数,若指定其为onst 类型,则表明其是一个常函数,不能修改类的成员变量;(5)对于类的成员函数,有时候必须const 为“值”。

12、线程和进程的区别和联系?

答:进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

13、简单阐述堆和栈的区别?

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

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

堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限

于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

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

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

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

14、为什么很多内置类如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模式时,也要注意这点。

15、#import跟#include的区别?

答:前者不会引起交叉编译的问题.因为在object-c中会存在c/c++和object-c混编的问题,如果用include引入头文件,会导致交叉编译.

16、请写出你对MVC模式的理解?

答:MVC模式考虑三种对象:模型对象、视图对象和控制器对象.模型对象负责应用程序的数据和定义操作数据的逻辑;视图对象知道如何显示应用程序的模型数据;控制器对象是M与V之间的协调者.

17、什么是键-值,键路径是什么KVC kVO

答:模型的性质是通过一个简单的键(通常是个字符串)来指定的.视图和控制器通过键来查找相应的属性值.在一个给定的实体中,同一个属性的所有的值具有相同的数据类型.键-值编码技术用于进行这样的查找--它是一种间接访问对象的属性的机制. 键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一起的对象性质序列.第一个键的性质是由先前的性质决定的,接下来每个键的值也是相对于其前面的性质.键路径使你可以独立于模型实现的方式指定相关对象的性质.通过键路径,你可以指定对象图中的一个任意深度的路径,使其指向相关对象的特定属性.

18、c和object-c如何混用,c++和object-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.

19、请列举你熟悉cocoa touch框架(至少三个)

答:

Core Animation

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

Core Audio

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

Core Data

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

20、自动释放池是什么,如何工作

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

1. ojc-c 是 通过一种"referring counting"(引用计数)的方式来管理内存的, 对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一, 每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0, 就会被系统销毁.
2. NSAutoreleasePool 就是用来做引用计数的管理工作的,这个东西一般不用你管的. 3. autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一.

21、object-c的优缺点

objc优点: 1) Cateogies 2) Posing 3) 动态识别 4) 指标计算 5)弹性讯息传递

6) 不是一个过度复杂的 C 衍生语言 7) Objective-C 与 C++ 可混合编程 缺点:
1) 不支援命名空间 2) 不支持运算符重载

3) 不支持多重继承

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

OC没有多重继承,Java也没有 C++才有

OC使用协议来实现多重继承

22、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,非原子性访问,不加同步,多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级。

23、ViewController 的 didReceiveMemoryWarning 是在什么时候被调用的?

内存警告会调用didReceiveMemoryWarning

答:相机会出现内存不足的情况 去掉调用

[super didReceiveMemoryWarning];

24、目标-动作机制

答:目标是动作消息的接收者。一个控件,或者更为常见的是它的单元,以插座变量(参见"插座变量"部分) 的形式保有其动作消息的目标。

动作是控件发送给目标的消息,或者从目标的角度看,它是目标为了响应动作而实现的方法。

程序需要某些机制来进行事件和指令的翻译。这个机制就是目标-动作机制。

25、单件实例是什么

答:Foundation 和 Application Kit 框架中的一些类只允许创建单件对象,即这些类在当前进程中的唯一实例。举例来说,NSFileManager 和NSWorkspace 类在使用时都是基于进程进行单件对象的实例化。当向这些类请求实例的时候,它们会向您传递单一实例的一个引用,如果该实例还不存在,则首先进行实例的分配和初始化。单件对象充当控制中心的角色,负责指引或协调类的各种服务。如果类在概念上只有一个实例(比如NSWorkspace),就应该产生一个单件实例,而不是多个实例;如果将来某一天可能有多个实例,您可以使用单件实例机制,而不是工厂方法或函数。

26、动态绑定

答:动态绑定将调用方法的确定也推迟到运行时。在编译时,方法的调用并不和代码绑定在一起,只有在消实发送出来之后,才确定被调用的代码。通过动态类型和动态绑定技术,您的代码每次执行都可以得到不同的结果。运行时因子负责确定消息的接收者和被调用的方法。运行时的消息分发机制为动态绑定提供支持。当您向一个动态类型确定了的对象发送消息时,运行环境系统会通过接收者的isa指针定位对象的类,并以此为起点确定被调用的方法,方法和消息是动态绑定的。而且,您不必在Objective-C 代码中做任何工作,就可以自动获取动态绑定的好处。您在每次发送消息时,
特别是当消息的接收者是动态类型已经确定的对象时,动态绑定就会例行而透明地发生。

27、sprintf,strcpy,memcpy使用上有什么要注意的地方

答:strcpy是一个字符串拷贝的函数,它的函数原型为strcpy(char *dst, const char *src);

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

memcpy,这是一个内存拷贝函数,它的函数原型为memcpy(void * dst,const void * src,size_t n); 将长度为len的一段内存,从src拷贝到dst中去,这个函数的长度可控。但是会有内存叠加的问题。

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

28、objective-c中是所有对象间的交互是如何实现的?

答:通过代理去进行通讯,或者通过观察者消息模式,Blocks ,appdelegate

29、编程中,保存数据有哪几种方式?

答:数组、自定义类、文件操作、数据库如:SQLite

文件 plist NSUserDefaults sqlite

30、Sizeof与strlen的区别和联系?

sizeof()()用来计算内存的strlen用来计算字符长度的。来个具体点的,一看就知道了。char a[] = "hello";sizeof()(a)
= 6;strlen(a) = 5;sizeof()会计算字符结尾的\0strlen 不会计算\0sizeof操作符返回占的空间;而对于一个数组,sizeof返回这个数组所有元素占的总空间。

而strlen不区分是数组还是指针,就读到\0为止返回长度。而且strlen是不把\0计入字符串的长度的。

31、什么是抽象类?抽象类有什么作用?能实例化吗?

答:NSOperation 没有完全实现的类叫抽象类, C++,java

抽象类不能实例化, 不能 NSOperation *a =[[NSOperation alloc] init];

32、调用一个类的静态方法需不需要release?

答:静态方法就是类方法,不需要,类的方法 ,对象放在autorelease中

33、assign和retain,copy的区别

答:assign就是和普通语言的赋值一样

retain 在一个对象中保存该对象需要拥有的对象

对该对象进行应用计数+1

@property (retain) 为了写程序方便

copy主要是赋值

一般 代理的申明都是assign 为什么

原因有2个,

1 根本就没有必要把代理的计数器+1

2. 主要是为了避免引用技术嵌套,递归

34、如何持久保存数据?

答:NSUserDefaults, Plist, SQLite3, file

35、网络方面得 比如如何检测联网 http xml等

ASIHTTPRequest Reacheable.[hm]

原理是ifconfig 是不是有ip地址

Reachability

来判断是否有网络3G Wifi

36、什么是UDP和TCP的区别是什么?

答:TCP的全称为传输控制协议。这种协议可以提供面向连接的、可靠的、点到点的通信。

UDP的全称为用户数据报协议,它可以提供非连接的不可靠的点到多点的通信。

用TCP还是UDP,那要看你的程序注重哪一个方面?可靠还是快速?

TCP/IP 建立连接的过程

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

第一次握手:建立连接时,客户端发送连接请求到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到客户端连接请求,向客户端发送允许连接应答,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的允许连接应答,向服务器发送确认,客户端和服务器进入通信状态,完成三次握手。

(所谓的三次握手就是要有三次连接信息的发送/接收过程。TCP连接的建立需要进行三次连接信息的发送/接收。)

37、解释类、对象、实例方法和实例成员

答:类:一类事物的抽象,有成员和方法。

对象:类的实例化和具体化

实例方法:主要和类方法区别,类方法声明时前面用加号,实例方法声明时用减号

实例成员:主要和类成员区分,类成员加static,实例成员不需要。

38、类名、方法名、成员名、函数名、宏定义首字母哪些大写,哪些小写?

答:大写:类名,宏定义

小写:方法名,成员名,函数名

39、@public,@protected,@private区别?

答:@public:完全公开,在程序的任何地方都可以调用

@private:和@public相反,只能在该类内部不调用

@protected:只有自己和自己的子类可以调用

40、如何声明一个带两个参数的实例方法和如何调用(举例说明)?

答:声明:-(void)methodForParameter1:(NSString *)p1 Parameter2:(NSString *)p2;

调用:[self methodForParameter1:@"" Parameter2:@""];

41、@property (nonatomic, retain) Example *example;

getter

- (Example *)example { return _example; }

setter

-(void)setExample:(Example *)aExample

{

if (example != aExample)

{

[example release];

example = [aExample retain];

}

}

42、static关键字的作用,extern关键字的作用?

答:static:定义全局变量;定义类成员;定义内部函数

extern:声明外部变量和外部函数,所声明的变量和函数可能不在本文件内定义或实现

43、解释self ?

答:self就是实例本身,在类里用self来调用自身的方法

44、什么时候使用继承?什么时候使用类别 ?

答:给一个类增加新的数据成员时用继承

只是想扩展类的方法或覆盖原来的方法时用类别

45、如何声明一个类?

@class Example或者

@interface Example

@end

46、写出1-2个与动态调用有关的方法 ?

答:respondsToSelector 、performSelector、conformsToProtocol、isKindOfClass、isMemberOfClass

47、写一个协议(举例),协议有什么用 ?

@protocol ExampleProtocol

- (void)exampleProtocol;

@end

@interface ExampleClass : NSObject

{

id delegate;

}

@property (nonatomic,assign) id delegate;

@end

48、存放数字用哪个类,存放CGRect用什么类型?

存放数字用NSNumber

存放CGRect用NSValue

49、快速枚举(举例) ?

NSArray *array = [NSArray array];

for (id object in array)

{

[object test];

}

50、有哪些集合类和存放二进制数据类?

答:NSArray/NSMutableArray,NSDictionary/NSMutableDictionary,NSSet/NSMutableSet/NSCountedSet,NSData存放二进制数据

51、文件处理用哪些类(写1-2个)?

答:NSFileManager\NSUserDefaults open, fopen

52、解释retain、copy、assgin、autorelease
?

答:retain,copy:计数器加一,区别是retain是原对象计数器加一,copy是创建一个新对象后,新对象计数器加一

assgin:简单复制,计数器不变

autorelease:内存延迟释放,计数器延迟减一

53、写出归档相关类 ?

答:NSKeyedArchiver、NSKeyedUnarchiver

54、写出xml解析和网络相关类 ?

答:xml解析:NSXMLParser, kissXML GDATA

网络:NSConnection

55、常用的xml/json解析和http请求第三方包各写出一个 ?

答:xml:kissxml

json:SBJSon

http请求:ASIHttpRequest SDWebImage, 异步图片加载器(界面流畅)

异步mp3 异步video

56、代理和通知的区别?

代理是垂直的,通知可以平行的

57、写出几个常用的设计模式(两个以上)?

答:MVC设计模式

单例模式

代理模式

通知模式

工厂模式

简单介绍集中设计模式:

1)模型视图控制器(MVC)。控制器负责行为,模型提供数据源,视图显示UI。模型和视图之间尽量不要直接打交道,他们之间的交互应该通过控制器来进行,控制器充当着桥梁的作用。这样设计的目的是使不同功能的类之间尽量解耦,以利于程序的扩展。

2)代理模式

委托代理(degegate),顾名思义,把某个对象要做的事情委托给别的对象去做。那么别的对象就是这个对象的代理,代替它来打理要做的事。反映到程序中,首先要明确一个对象的委托方是哪个对象,委托所做的内容是什么。这里所做的内容是靠协议中的方法来实现,方法分两种:必需实现(@required)的方法和根据情况选择实现(@optional)的方法。

举个例子:你是房屋租赁中介,某个房东和你签订协议,请你替他把房子出租出去。这时,你就是房东的代理,你必须实现的方法是把屋子出租出去,选择实现的方法是装修、添置家具、打隔断等(依据协议而定)。

3)通知模式

通知模式是观察者模式的一种。a对象在通知中心注册了观察者之后,b对象发出通知广播,a对象收到通知后就知道去做具体的事。观察者可以是一个或多个,也可以没有。举个例子:微博切换帐号后会发出一个通知,让多个界面重新刷新数据。

4)KVO模式

Key-Value-Observer模式也是观察者模式的一种。KVO的机制为:当指定的被观察对象的属性被修改的时候,KVO都会自动的去通知相应的观察者。举个例子,在控制器里通过addObserver:forKeyPath:options:context:注册一个数据源观察者,当数据源里的数据发生变化时,通过willChangeValueForKey:和didChangeValueForKey:这一对方法发出广播,控制器收到广播后就可以利用新的数据来刷新界面。

5)单例模式

通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

单例模式有时也是出于现实逻辑的考虑,比如,一个学校只能有一个校长,校长对象应该就是一个单例对象。虽然从程序的角度你可以初始化多个校长,但这并不符合客观现实。

58、object-c中frame和bounds区别?

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

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

-(CGRect)frame{

return CGRectMake(self.frame.origin.x,self.frame.origin.y,self.frame.size.width,self.frame.size.height);

}

-(CGRect)bounds{

return CGRectMake(0,0,self.frame.size.width,self.frame.size.height);

}

很明显,bounds的原点是(0,0)点,而frame的原点却是任意的。

59、object-c有无多重继承,如何实现?

答:首先object-c不能够多继承,但它提供了另外一种解决方案,使对象可以响应在其它类中实现的消息(别的语言中,一般叫方法,两者无差别). 这种解决方案叫做消息转发,它可以使一个类响应另外一个类中实现的消息。OC使用协议来实现多重继承

60、写一个你所经历项目架构 或者cocoa里的MVC模式?

61、如何实现Push 通知的机制(大致写下)?

答:1用网站把要发送的消息、目的iPhone的标识打包,发给APNS。

2APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。

3iPhone把发来的消息传递给相应的应用程序, 并且按照设定弹出Push通知

62、如何实现滚动到底部自动加载,以及显示一个 loading cell?

答:用scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate方法计算是否触底,调用异步刷新事件scrollViewDidScroll

63、如何实现从外部打开程序?

在项目的Info.plist文件中 添加一个 URL types 节点就可以了

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@""]];

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://18533221222"]];

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://18533221222"]];

64、代理和通知作用与区别?

答:通知需要有一个通知中心:NSNotificationCenter,自定义通知的话需要给一个名字,然后监听;优点:通知的发送者和接受者都不需要知道对方.可以指定接收通知的具体方法.通知名可以是任何字符串.缺点:较键值观察(KVO)需要多点代码,在删除前必须移除监听者.

代理:通过setDelegate来设置代理对象,最经典的例子是常用的TableView.优点:支持它的类有详尽和具体信息.缺点:该类必须支持委托.某一个时间只能有一个委托连接到某一个对象.

代理通常用于一对一的关系,通知可以是一对一或一对多或一对无的关系。代理的receive可以把结果返回给sender,通知的sender只负责把消息发送出去不需要返回结果

65、介绍一下树?

66、面向对象的特点?

1.信息隐藏和封装特性:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。2.继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。3.组合特性组合用于表示类的“整体/部分”关系。例如主机、显示器、键盘、鼠标组合成一台计算机。4.动态特性(1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。(2)多态性:多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。

67、动画实现一个view从顶部移动到底部?

68、用预处理指令#define定义求两个数中的较大值?

69、阐述static关键字的作用?

(1)设置变量的存储域,函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;

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

(3)限制函数的作用域,在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;(4)在类中的static成员变量意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见;(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。

70、定义属性时,什么情况使用copy,assign,和retain?

71、object-c中protocol、se'le'c'tselector、category是什么?

72、怎么读取本地文件内容?

NSString *path = [[NSBundle mainBundle]pathForResource:@"Util-Info" ofType:@"plist"];

NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:path];

73、iPhone开发的两种方式是什么,各自的优缺点。

答:Web开发和SDK编程,这两种开发方式各有利弊,但他们都能为应用程序提供丰富、强大的功能。由于两种开发模型在本质上存在差异,所以他们各自适用的开发情形也不相同。Web开发适合创建功能简单、动态且需要因特网连接的应该程序,而SDK编程适合创建功能复杂、强大的应用程序。

74、OC的两种内存管理方式,iOS都支持吗?

答:MRR,手动管理.ARC,自动引用计数.ios都支持.

75、Notification是什么,优缺点是什么,用什么可以代替。

76、用OC写一个单例

+(id)shareDefault

+(id)shareDefault

{

Static id s;

If(s==nil)

{

S=[[self alloc] init]

}

Return s;

}

77、Asi 的缺点(扯到第三方的时候问得)?

78、请问关键字 alloc 和 init 的 区别?

答:alloc是分配内存,对象计数器为1 init是初始化工作 类似于c++构造函数

79、请写出实现多线程操作涉及的类及 简单 示例;

答: NSThread, NSOperation, Blocks/GCD, pthread都是多线程操作函数

常用 NSThread detachNewThreadSelector

NSOperation是在网络上用的多写 继承NSOperation 实现了main函数

Blocks是也是工作线程

80、请分别简述 notification 的同步和异步的调用方法

是广播模式/观察者模式,可以异步查看系统或者自定义一些事件

81、view 和 viewcontroller 的 关系?

答:UIviewController其实相当于一个容器,一个控制器,里面包含了一个根的uiview

M(MutableArray DB) C V

82、用static 修饰 的 变量和 函数的意义分别是 什么?

static 可以修饰函数作用域,

static修饰变量作用域 或者文件内全局/局部变量

有时候有static inline混在一起内联编译

83、http 协议,get, post区别?

get是简单的http协议

post是从客户端提交复杂的参数,包括文件

84、.#import,#inlcude与@class的区别?

答:1)假如有三个类A,B,C,B头文件中包含了C,A头文件包含了B和C,此时若用#include,则会提示C被重复定义的错误,而用#import则可以编译通过。这是因为#import会作判断,不会引起重复编译的问题。

2)@class仅是声明了一个类的名称,若在头文件中声明了@class,并声明了该类的对像,则在源文件中还要把该类#import进来。

假如有两个类X和Y,X中#import了Y,Y中#import了X,此时若在X中声明Y
*y;或在Y中声明了X *x;编译时会报错:找不到Y或X的定义。

解决方法为在X,Y的头文件中用@class先声明,然后在源文件里#import

3)在iOS开发中,Objective-c类应使用#import,C/C++类应使用#include

85、Difference between shallowcopy and deep copy? 浅复制和深复制的区别?

浅层复制:只复制指向对象的指针,而不复制引用对象本身。深层复制:复制引用对象本身。

比如有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改
。深复制就好理解了,内存中存在了两份独立对象本身。

打个比方:浅复制好比你和你的影子,你完蛋,你的影子也完蛋。深复制好比你和你的克隆人,你完蛋,你的克隆人还活着。

86、.What is advantage ofcategories? What is difference between implementing a category and inheritance?类别的作用?继承和类别在实现中有何区别?

答:类别可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除或修改。并且如果类别和原来类中的方法产生名称冲突(名称重复),则类别将覆盖原来的方法,因为类别具有更高的优先级。类别主要有3个作用:(1)将类的实现分散到多个不同文件或多个不同框架中。(2)创建对私有方法的前向引用。(3)向对象添加非正式协议。

继承可以增加或修改 方法,并且可以增加属性。

87、Difference between method and selector?方法和选择器有何不同?

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

88、What is lazy loading?

懒汉模式,只在用到的时候才去初始化。也可以理解成延时加载。最简单的一个列子就是tableView中图片的加载显示了。一个延时加载,避免内存过高,一个异步加载,避免线程堵塞。

89、static 关键字的作用?

(1)函数体内static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;

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

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

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

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

90、在一个对象的方法里面: self.name = “object”;和name =”object”有什么不同吗?

答:self.name = "object"会调用对象的setName()方法,会使object引用计数加1,name = "object"会直接把object赋值给当前对象的name 属性,引用计数不增加。

91、WebSocket 协议

WebSocket 协议本质上是一个基于 TCP 的协议。为了建立一个 WebSocket 连接,客户端浏览器首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,包含了一些附加头信息,其中附加头信息”Upgrade:
WebSocket”表明这是一个申请协议升级的 HTTP 请求,服务器端解析这些附加的头信息然后产生应答信息返回给客户端,客户端和服务器端的 WebSocket 连接就建立起来了,双方就可以通过这个连接通道自由的传递信息,并且这个连接会持续存在直到客户端或者服务器端的某一方主动的关闭连接。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios面试题