iOS面试题


文章转载自:http://www.pythonheidong.com/blog/article/3327/

iOS面试题

 

1.Difference between shallow copy and deep copy?

浅复制和深复制的区别?

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

 

2.What is advantage of categories? What is difference between implementing a category and inheritance?

类别的作用?继承和类别在实现中有何区别?

category可以在不熟悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。并且如果类别和原来类中的方法名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。

类别主要有3个作用:

(1)将类的实现分散到多个不同文件或多个不同框架中。

(2)创建对私有方法的前向引用。

(3)向对象添加非正式协议。

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

 

3.Difference between categories and extensions?

类别和类扩展的区别。

categories和extensions的不同在于后者可以添加属性。另外后者添加的方法是必须要实现的。

extensions可以认为是一个私有的categories。

 

4.Difference between protocol in objective c and interfaces in Java?

obc中的协议和java中得接口概念有何不同?

obc中的代理有2层含义,官方定义为formal和informal protocol。前者和Java接口一样。

informal protocol中的方法属于设计模式考虑范畴,不是必须实现的,但是如果有实现,就会改变类的属性。现在协议有2个修饰词:”必须实现(@requied)“和”可选实现(@optional)“。

 

5.What are KVO and KVC?

kvc:键值编码是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制。很多情况下可以简化程序代码。

kvo:键值观察机制,他提供了观察某一属性变化的方法,极大的简化了代码。

 

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时动态运行时语言是什么意思?

主要是将数据类型的确定由编译时推迟到运行时。

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

多态:不同对象以自己的方式响应相同的消息的能力叫做多态。

 

9.What is difference between NSNotification and protocol?

通知和协议的不同之处?

协议有控制链的关系,通知没有。通知一对多,代理则对象不用所做的事情不同。通知只负责发出。

10.What is push notification?

什么是消息推送?

推送是一个技术,获取资源的手段。

 

11.Ploymorphism?

关于多态性?

多态,子类指针可以赋值给父类。

 

12.Singleton?

对于单例的理解?

答案:保证在内存中拥有只有类的单个实例

 

13.如何在多线程访问单例时的安全性

答案:

 

14.What is responder chain?

响应链

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

 

15.Difference between frame and bounds?

frame是以父控件左上角为坐标原点,bounds是以自身为原点。

 

16.Difference between method and selector?

方法和选择器有何不同?

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

 

17.Is there any garbage collection mechanism in Objective C?

obc的垃圾回收机制?

obc2.0有Garbage collection,但是iOS平台不提供。obc一般都是手动管理内存但也有自动释放池。

 

18.NSOperation queue?

存放NSOperation的集合类。

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

 

19.What is lazy loading?

用到时才初始化,延迟加载。

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

 

20.Can we use two tableview controllers on one viewcontroller?

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

一个试图控制只提供了一个view试图,有的能例如TabBarController。

 

21.Can we use one tableview with two different datasources?How you will achieve this?

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

不解。

 

22.Objective C的类可以多重继承么?可以实现多个接口么?重写一个类的方式用继承还是分类好?为什么?

obc只支持单继承,可以实现多个接口,如果要实现多继承的话,可以通过类别和协议的方式来实现。一般情况下用分类好,用category重写类的方法,仅对本category有效,不会影响其他类和原有类的关系。

 

23.#import跟#include有什么区别,@class,@import<>跟@import”“有什么区别?

#import是Objective C导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动导入一次,不会重复导入,相当于#include和#pragma once;@class告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含;#import<>用来包含系统的头文件,#import”“用来包含用户头文件。

 

24.属性readwrite,readonly,assign,retain,copy,nonatomic各是什么作用,在哪种情况下用?

readwrite是可读可写特性,需要生成getter方法和setter方法。

readonly是只读特性,只会生成getter方法,不希望属性在类外改变。

assign是赋值特性,setter方法将传入参数赋值给实例变量。

retain表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1。

copy表示赋值特性,setter方法将传入对象复制一份,需要完全一份新的变量。

nonatomic非原子操作,决定编译器生成的setter,getter是否是原子操作。

atomic表示多线程安全,一般使用nonatomic。

 

25.类变量的@protected,@private,@public,@package声明各有什么含义?

 

26.id声明的对象有什么特性?

id声明的对象具有运行时的特性,即可以指向任意类型的obc的对象。

 

27.MVC?特性?为什么被广泛运用?

MVC设计模式包括:Model,View,Controller。相互之间的链接使之更加面向对象。

 

28.对于语句NSString *str =[ [NSData alloc] init];str在编译和运行时分别是什么类型的对象?

编译是NSString,运行是NSData。

 

29.for(int index = 0; index < 20; index++ ){

NSString *str = @“temp”;

NSLog(temp);

NSNumber *num = [NSNumber numberWithInt:2];

NSLog(num);

}

这段代码有什么问题?会不会造成内存泄露(多线程)?在内存紧张的设备上做大循环时自动释放池是写在循环内还是循环外好?为什么?

 

30.内存管理的几条原则是什么?按照默认法则,那些关键字生成的对象需要手动释放?在和prpperty结合的时候怎样有效的避免内存泄露?

谁申请,谁释放。遵循Cocoa Touch的使用原则;

内存管理主要要避免“过早释放”和“内存泄漏”,对于“过早释放”需要注意@property设置特性时,一定要用对特性关键字,对于“内存泄漏”,一定要申请了要负责释放,要细心。

关键字alloc 或new 生成的对象需要手动释放;

设置正确的property属性,对于retain需要在合适的地方释放,

31.在一个对象释放前,如果他被加到了notificationCenter中,不在notificationCenter中remove这个对象可能会出现什么问题?

 

32.怎样实现一个singleton的类,给出思路。

 

33.什么是序列化或者Acrchiving,可以用来做什么,怎样与copy结合,原理是什么?

 

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

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

 

35.runloop是什么?在主线程中的某个函数里调用了异步函数,怎么样block当前线程,且还能响应当前线程的timer事件,touch事件等。

 

36.iOS平台怎么做数据的持久化?CoreData和SQLite有无必然联系?CoreData是一个关系型数据库吗?

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

 

37.阐述一个nil对象从interface builder产生,到载入程序运行空间,最后被释放时所经历的生命周期。

 

38.UNIX上进程怎么通信?

UNIX主要支持三种通信方式:

1).基本通信:主要用来协调进程间的同步和互斥

(1)锁文件通信

通信的双方通过查找特性目录下特定类型的文件(称锁文件)来完成进程间对临界资源访问时的互斥;例如进程p1访问一个临界资源,首先查看是否有一个特性类型文件,若有则等待一段时间再查找锁文件。

(2)记录锁文件

2).管道通信:适应大批量的数据传递

3).IPC:适应大批量的数据传递

 

38.Timer的间隔周期准吗?怎样实现一个精准的Timer?

 

39.UIScrollView用到了什么设计模式?还能在foundation库中找到类似的吗?

 

40.如果要开发一个类似eclipse的软件,支持插件结构。且开放给第三方开发。你会怎么设计?

 

41.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]; 

&a是数组指针,其类型为int(*)[5];而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同。a是长度为5的int数组指针,所以要加5*sizeof(int)所以实际是a[5],但是prt与(&a + 1)类型是不一样的,所以prt - 1只会减去sizeof(int*),a,&a的地址是一样的,但意思不一样,a是数组首地址,也是a[0]的地址,&a是对象首地址,a + 1是数组下一元素的地址,即a[1],&a + 1是下一个对象的地址,即a[5]。

 

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

原子操作信号量机制自旋锁管理,会合,分布式系统

 

42.进程之间通信的途径

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

 

43.进程死锁的原因

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

 

44.死锁的四个必要条件。

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

 

45.死锁的处理

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

 

46.堆和栈的区别?

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

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

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

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

 

47.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编译后的文件,这个东西其实是无差别的,所以可以用,Obj-C的编译器支持cpp。

 

48.目标-动作机制

目标是动作消息的接受者。一个控件,或者更为常见的时它的单元,以插座变量的形式保有其动作消息的目标。

动作是控件发送给目标的消息,或者从目标的角度看,它使目标为了响应动作而实现的方法,程序需要某些机制来进行事件和指令的翻译,这个机制就是目标-动作机制。

 

49.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

50.Obj-C的内存管理

如果你拷贝一个对象,你也拥有拷贝得到的对象,需要负责该对象的释放

如果你保持一个对象,你就部分拥有这个对象,需要在不再使用时候释放对象

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

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

autorelease和release在引用计数减一的时机不同,autorelease会在对象的使用结束才做计数减一。

52.类工厂方法

类工厂方法的实现是为了向客户提供方便,它们将分配和初始化合在一个步骤中,返回被创建的对象,并进行自动释放处理。另一个目的是使类提供单件实例。

53.单件实例是什么?

Foundation和Application Kit 框架中得一些类只允许创建单件对象,即这些类在当前进程中得唯一实例。

54.动态绑定—在运行时确定要调用的方法

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

55.obj-c的优缺点

objc优点:
  1)Cateogies
  2) Posing
  3) 动态识别
  4) 指标计算
  5)弹性讯息传递
  6) 不是一个过度复杂的 C 衍生语言
  7) Objective-C 与 C++ 可混合编程

缺点:
  1)不支援命名空間
  2)不支持运算符重载

  3)不支持多重继承

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

56.ViewController的 didReceiveMemoryWarning 是在什么时候被调用的?

默认调用[superdidReceiveMemoryWarning]

57.谈谈你对ARC 的认识和理解?

58.  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"];

[aClasssetName: newname];

[newnamerelease];

我们来看一看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。

59. 在一个对象的方法里面:

self.name<http://self.name/> = “object”;

name =”object”

有什么不同?

 60. 这段代码有什么问题:

@implementation Person

- (void)setAge:(int)newAge {

self.age = newAge;

}

@end

61.  什么是retaincount?

62.  为什么很多内置类如UITableViewController的delegate属性都是assign而不是retain的?

63.  定义属性时,什么情况使用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是否为原子操作。在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。

 

64. 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。

65.  这段代码有什么问题,如何修改

for (int i = 0; i < someLargeNumber; i++)

{

NSString *string = @”Abc”;

string = [string lowercaseString];

string = [stringstringByAppendingString:@"xyz"];

NSLog(@“%@”, string);

}

66. Objective C中的protocal是什么?

@protocal obj里面的协议就如同java里面的interface。

67. Objective C中的selector 是什么?

你可以理解 @selector()就是取类方法的编号,他的行为基本可以等同C语言的中函数指针,只不过C语言中,可以把函数名直接赋给一个函数指针,而 Objective-C的类不能直接应用函数指针,这样只能做一个@selector语法来取.它的结果是一个SEL类型。这个类型本质是类方法的编号 (函数地址)。

68. 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 。

69. UITableViewController 中,创建UITableViewCell时,initWithSytle:resuseIdentifier中,reuseIdentifier有什么用?简述UITableViewCell的复用原理.

复用队列的元素增加:只有在cell被滑动出界面的时候,此cell才会被加入到复用队列中。每次在创建cell的时候,程序会首先通过调用 dequeueReusableCellWithIdentifier:cellType方法,到复用队列中去寻找标示符为“cellType”的 cell,如果找不到,返回nil,然后程序去通过调用[[[UITableViewCell alloc]initWithStyle:style reuseIdentifier:cellType] autorelease]来创建标示符为“cellType”的cell。

70. UIView 和CALayer 有什么区别?

两者最大的区别是,图层不会直接渲染到屏幕上。

71.iOS上的多线程

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

 

NSOperation与Queue

NSOperation是一个抽象类,它封装了线程的细节实现,我们可以通过子类化该对象,加上NSQueue来同面向对象的思维,管理多线程程序。

 

NSThread

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

在项目什么时候选择使用GCD,什么时候选择NSOperation?

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

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

 

72.Objective-C如何对内存管理的,说说你的看法和解决方法?

Objective-C的内存管理主要有三种方式ARC(自动内存计数)、手动内存计数、内存池。

73.如何对iOS设备进行性能测试?

Profile-> Instruments ->Time Profiler

74.What are commonly used NSObject class methods?

类NSObject的那些方法经常被使用?

NSObject是Objetive-C的基类,其由NSObject类及一系列协议构成。

其中类方法alloc、class、 description 对象方法init、dealloc、– performSelector:withObject:afterDelay:等经常被使用 

75..What is convenience constructor?

什么是简便构造方法?

简便构造方法一般由CocoaTouch框架提供,如NSNumber的 + numberWithBool:  + numberWithChar:  + numberWithDouble:  + numberWithFloat:  + numberWithInt:

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

76.How can you store data in iPhone applications?

在iPhone应用中如何保存数据?

有以下几种保存机制:

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

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

3.通过SQlite或CoreData保存在文件数据库中

77.What is coredata?

什么是coredata?

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

78.What is NSManagedObject model?

什么是NSManagedObject模型?

NSManagedObject是NSObject的子类 ,也是coredata的重要组成部分,它是一个通用的类,实现了core data 模型层所需的基本功能,用户可通过子类化NSManagedObject,建立自己的数据模型。

 

79.What is NSManagedobjectContext?

什么是NSManagedobjectContext?

NSManagedobjectContext对象负责应用和数据库之间的交互。

80.What is predicate?什么是谓词?

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

    predicate = [NSPredicate predicateWithFormat:@"customerID == %d",n];

    a = [customers filteredArrayUsingPredicate:predicate];

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

ASIHTTPRequest与NSURLConnection

82.简单介绍下NSURLConnection类及+ sendSynchronousRequest:returningResponse:error:– initWithRequest:delegate:两个方法的区别?

NSURLConnection主要用于网络访问,其中+ sendSynchronousRequest:returningResponse:error:是同步访问数据,即当前线程会阻塞,并等待request的返回的response,而– initWithRequest:delegate:使用的是异步加载,当其完成网络访问后,会通过delegate回到主线程,并其委托的对象。

83.block的使用

使用实例

使用typed声明block

typedef void(^didFinishBlock) (NSObject *ob);

这就声明了一个didFinishBlock类型的block,

然后便可用

@property (nonatomic,copy) didFinishBlock  finishBlock;

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

__block是一种特殊类型,

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

 

84.多线程与block

GCD与Block

使用 dispatch_async 系列方法,可以以指定的方式执行block

GCD编程实例

 

dispatch_async的完整定义

   void dispatch_async(

   dispatch_queue_t queue,

   dispatch_block_t block);

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

 

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

dispatch_async(dispatch_get_main_queue(),^(void){finishBlock();}); 

85.App出现内存泄露时,如何追踪和解决的?

86.编写一段程序,计算数字的总和且打印数字的英文单词,例如12343,计算13,打印“one,two,three,four,three”。接受任意输入。

87.根据下面的定义

float f = 1.00;

short int i = 100;

long int l = 500L;

double d = 15.00;

确定下面的结果值和类型:

f + i;

l / d;

i / l + f;

l * i;

f / 2;

i / (d + f);

l / (i * 2.0);

l + i/(double)l;

88.编写一个名为IS_UPPER_CASE的宏,其作用如果字符是大写字母,就给出非零的值。

89.编写一个程序来替代shell里的ls命令。

90.NSTimer是否是多线程的?使用时是否要加同步锁?

91.一般在哪个函数中创建某个View的子View。

92.Objective C中Category和Extension的区别是什么?

93.运算符的运算等级。

94.写一个单例的实现代码,要求可编译。

95.写一个字符串反转的实现函数

96.写一个委托的interface,写一个代理。略

97.Overload和Override的区别?编译器如何实现这两种规则?

98.将“引用”函数作为参数有哪些特点?什么时候需要“常引用”?

99.C和Obj-C如何混用?

100.cocoa有哪些设计模式?

101.socket编程中如何判断异步connect是否成功?

102.iOS的七层模式?TCP/UDP属于哪一层?TCP/UDP有何优缺点?

103.TCP/IP中端口有何作用?

104.- (NSInteger)v1:(NSInteger)x{

    NSInteger c = 0;

    while (x) {

        x &= x - 1;

        c ++;

    }

    return x;

}

当x = 9999时输出是8.

 

 

PS:自己花时间收集的众多面试题,希望对大家有帮助! 

文章转载自:http://www.pythonheidong.com/blog/article/3327/


作者:雄霸天下-无人能挡,发布于:2019/08/15
原文:https://www.cnblogs.com/xiongbatianxiaskjdskjdksjdskdtuti/p/11356463.html