面试题总结

1.#includ,#import,@Class区别

#include

        #include  <>    :用于对 系统文件的引用,编译器会在系统文件目录下去查找该文件。
 
        #include "xx.h":用于对用户自定义的文件的引用,编译器首先会去用户目录下查找,然后去安装目录,最后去系统目录查找。
 
       注:使用include要注意重复引用的问题:
 
       class A,class B都引用了class C,class D若引用class A与class B,就会报重复引用的错误。
 
#import
      功能与include基本相同,不过它避免了重复引用的问题。所以在OC中我们基本用的都是import。
 
@class
      @class就是告诉编译器有这个类存在,但是类是如何实现的不用告诉编译器.若.m文件用到了这个类,还是要在.m文件汇总import这个类的。
      既然这样,为什么不直接在头文件中import呢,举个例子:
      class A引用了class B,class B引用了class C.... , class A,B,C...的头文件又import了很多文件,那么 import了A的话,编译器就需要编译大量的文件,编译时间就会增加。 
 
      难道头文件中都是用@class吗?当然不是,有时也是需要#import的,那么什么时候该用什么呢?
(1)一般如果有继承关系的用#import,如B是A的子类那么在B中声明A时用#import;
 
(2) 另外就是如果有循环依赖关系,如:A->B,B->A这样相互依赖时,如果在两个文件的头文件中用#import分别声明对方,那么就会出现头文件循环利用的错误,这时在头文件中用@class声明就不会出错;
 
(3)还有就是自定义代理的时候,如果在头文件中想声明代理的话如@interface SecondViewController:UIViewController时应用#import不然的话会出错误,注意XXXXDelegate是自定义的。


2.堆和栈的区别

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

申请大小: 

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

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

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

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

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

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

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

1.  ojc-c 是 通过一种"referring counting"(引用计数)的方式来管理内存的, 对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一, 每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0, 就会被系统销毁. 

2. NSAutoreleasePool 就是用来做引用计数的管理工作的,这个东西一般不用你管的. 

3. autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一. 


4.readwritereadonlyassignretaincopynonatomic属性的作用 


@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。这是为了减少对上下文的依赖而引入的机制。 

copy是在你不希望a和b共享一块内存时会使用到。a和b各自有自己的内存。

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

atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。在多线程环境下,原子操作是必要的,否则有可能引起错 误的结果。加了atomic,setter函数会变成下面这样:

6.@synthesize @dynamic

@synthesize 是系统自动生成getter和setter属性声明

@dynamic 是开发者自已提供相应的属性声明


7.Difference between shallow copy and deep copy?
浅复制和深复制的区别?


答案:浅层复制:只复制指向对象的指针,而不复制引用对象本身。
深层复制:复制引用对象本身。
意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,AA_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源
还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。深复制就好理解了,内存中存在了
两份独立对象本身。
用网上一哥们通俗的话将就是:
浅复制好比你和你的影子,你完蛋,你的影子也完蛋
深复制好比你和你的克隆人,你完蛋,你的克隆人还活着。


8.What is advantage of categories? What is difference between implementing a category and inheritance?
类别的作用?继承和类别在实现中有何区别?
答案:category 可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。
并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。
类别主要有3个作用:
(1)
将类的实现分散到多个不同文件或多个不同框架中。
(2)
创建对私有方法的前向引用。
(3)
向对象添加非正式协议。
 
继承可以增加,修改或者删除方法,并且可以增加属性。

9.Difference between categories and extensions?
类目和延展的区别。
 答案:categoryextensions的不同在于 后者可以添加属性。另外后者添加的方法是必须要实现的。
extensions可以认为是一个私有的Category

10.What is purpose of delegates?
代理的作用?

答案:代理的目的是改变或传递控制链。允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。可以减少框架复杂度。
另外一点,代理可以理解为java中的回调监听机制的一种类似。

11.31What is push notification?
什么是推送消息?

推送通知更是一种技术。
简单点就是客户端获取资源的一种手段。
普通情况下,都是客户端主动的pull
推送则是服务器端主动push

12.Difference between frame and bounds?
framebounds有什么不同?

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


13.Difference between method and selector?

方法和选择器有何不同?

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


14.What is lazy loading?
答案:懒汉模式,只在用到的时候才去初始化。
也可以理解成延时加载。
我觉得最好也最简单的一个列子就是tableView中图片的加载显示了。
一个延时载,避免内存过高,一个异步加载,避免线程堵塞。

15.static有什么用途?(请至少说明两种)

     1.限制变量的作用域
            2.
设置变量的存储域

16.全局变量和局部变量在内存中是否有区别?如果有,是什么区别?

            全局变量储存在静态数据库,局部变量在堆栈

17.堆栈溢出一般是由什么原因导致的?
            没有回收垃圾资源

18.不能做switch()的参数类型是:
            switch的参数不能为实型。

 19.如何引用一个已经定义过的全局变量?
            答:extern
            可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个
            在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你
            extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期
            间报错

20.局部变量能否和全局变量重名?
            答:能,局部会屏蔽全局。要用全局变量,需要使用"::"


 21.do……whilewhile……do有什么区别?
            答:前一个循环一遍再判断,后一个判断以后再循环

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

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

23. Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么?

线程创建有三种方法:使用NSThread创建、使用GCD的dispatch、使用子类化的NSOperation,然后将其加入NSOperationQueue;在主线程执行代码,方法是performSelectorOnMainThread,如果想延时执行代码可以用performSelector:onThread:withObject:waitUntilDone:

24.描述一下iOS SDK中如何实现MVC的开发模式

iOS SDK是开发iPhone和iPad 应用程序过程中必不可少的软件开发包,提供了从创建程序,到编译,调试,运行,测试等一些列开发过程中所需要的工具)

MVC是模型、试图、控制开发模式,对于iOS SDK,所有的View都是视图层的,它应该独立于模型层,由视图控制层来控制。所有的用户数据都是模型层,它应该独立于视图。所有的ViewController都是控制层,由它负责控制视图,访问模型数据。

25.When you will create an autorelease pool in your application?

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

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

26.界面间传值的方式有:

属性传值: 属性传值适用于从前往后传值.

代理传值:适用于从后往前传值.

单例传值: 适合于从前往后传,从后往前传都可以, 但是内存空间不会被释放直到应用程序结束.

NSUserDefaults:数据持久化的一种方式,数据可以长久的存储,存到本地然后再从本地获取.

通知:通知的使用需要注册通知,以及发送通知.

block: 需要定义block,当block进行回调时将值传给其他界面,适用于从后往前

初始化方法:给第二个界面写一个初始化方法,当进入下一界面时,将第一个界面的值作为初始化方法的参数.适用于从前往后传值.

全局变量:适合多个界面之间进行传值,但是空间不会被释放.

27. 设计模式有:

单例,delegate,观察者模式,响应者模式,MVC,工厂模式,target。。action。消息中心

对MVC的理解:

模型-视图-控制器。将数据和视图分离开来,简化后续对程序的修改和扩展,使程序的复用性更高,减少耦合度。

      Model,数据模型。用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。

      View,视图。视图层能够将从模型中得到的数据进行展示,并提供交互方式。

      Controller,控制器。组织管理不同层面的视图和数据模型,解除模型和视图之间的耦合。

      在MVC中,实现了M和V的代码分离。

      Controller可以直接和Model、View进行通信。负责View的事件处理,Model数据显示在View。

     View不能直接引用Controller,负责接受用户交互和显示Controller提供的数据。并将事件,提供Controller处理。

     Model和View不能直接进行通信,必须通过Controller进行控制。

    优点:低耦合性,重用性高,易于维护。

 

5.如果当前对象将block拷贝到堆区中,就不要在block体中使用该对象以及该对象的实例变量.

28.数据持久化的方式.

Plist文件:plist文件当修改时会将原来的值给重新覆盖掉.

NSUserDefaults: 存储一个用户的设置信息,比如记录用户是否是第一次启动程序.存放在Library下的preferences文件夹下.

文件读写: 文件读写是将数据保存成一个文件,存储在本地,但是只针对于四种数据类型,NSData,NSString,NSArray,NSDictionary.

归档和反归档: 可以对自定义的类来进行数据持久化存储.

数据库: 数据库来实现数据持久化存储的便利性在于可以方便的进行增删改查.

29.网络的同步的异步的区别:

同步:我们的程序请求数据,这时应用程序会暂停等待请求结果,当等到请求结果后才继续运行.

异步: 程序发起网络请求,这时程序会等待请求结果,但是不会暂停运行,在这其间也能响应用户的其他操作,等请求结果返回后进行处理.

同步连接容易造成UI卡死, 影响用户体验.

而异步连接的可控性非常好,而且界面也不会冻结,用户体验好.

30.Post 和get的区别:

 

Post和get都可以用于从网络请求数据,以及提交数据,不过对于post和get之间

(1)          格式不同,get请求会把请求参数拼接到URL上.而post请求会把参数以二进制流的形式发给服务器.

(2)          Get请求不安全,post请求安全性比较高

(3)          请求体大小也不一样,提交数据时,会使用POST请求,因为get提交的数据最多只能是1024字节,而post请求则没有大小限制.


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

ios笔试的一些基础知识(网上摘录)

1.简单阐述static关键字的作用:

(1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;(2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;(3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;(4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。

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

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

3.简单阐述一下Objective-C内存管理:

(1)当你使用new,alloc和copy方法创建一个对象时,该对象的保留计数器值为1.当你不再使用该对象时,你要负责向该对象发送一条release或autorelease消息.这样,该对象将在使用寿命结束时被销毁.(2)当你通过任何其他方法获得一个对象时,则假设该对象的保留计数器值为1,而且已经被设置为自动释放,你不需要执行任何操作来确保该对象被清理.如果你打算在一段时间内拥有该对象,则需要保留它并确保在操作完成时释放它.(3)如果你保留了某个对象,你需要(最终)释放或自动释放该对象.必须保持retain方法和release方法的使用次数相等.

4.你是怎么理解MVC的,在Cocoa中MVC是怎么实现的?

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的集合

5简述NSAutoreleasePool的作用的工作机制NSAutoreleasePool是用于管理iphone应用的生命周期内所有的自动释放对象。当应用程序中有自动对象创建时,该对象就会被加入到该自动释放池。当应用程序结束时,该池会释放池中全部的自动释放对象[poolrelease]

6多线程在ios开发中的做用,常用的多线程类的好处和方法有哪些。

资源利用率更好,程序设计在某些情况下更简单,程序响应更快。iOS有三种主要方法:1、NSThread。2、NSOperation。3、GCD

7.什么是delegate,delegate在oc中主要起了什么作用?

为什么delete设属性的时候要设assgin而不是retainiphone开发重要基础知识------委托代理(degegate)首先,委托是协议的一种,顾名思义,就是委托他人帮自己去做什么事。也就是当自己做什么事情不方便的时候,就可以建立一个委托,这样就可以委托他人帮自己去实现什么方法。其次,委托的作用有两个,一个是传值,一个是传事件。(1)所谓传值经常用在b类要把自己的一个数据或者对象传给a类,让a类去展示或者处理。(切分紧耦合,和代码分块的时候经常用)(2)所谓传事件就是a类发生了什么事,把这件事告诉关注自己的人,也就是委托的对象,由委托的对象去考虑发生这个事件后应该做出什么反映。(这个经常见,例如在异步请求中,界面事件触发数据层改变等等)(3)利用委托赋值,这种方法感觉是为了不暴露自己的属性就可以给自己复值,而且这样更方便了类的管理,只有在你想要让别人给你赋值的时候才调用,这样的赋值更可控一些。(例如tableView中的委托(dateSource)中常见)。delegate设置成assign是为了防止循环引

8.你了解的设计模式都有哪些,谈谈对MVC的理解

MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。MVC是一个框架模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。MVC好处是它能为应用程序处理很多不同的视图。框架模式和设计模式的区别有很多程序员往往把框架模式和设计模式混淆,认为MVC是一种设计模式。实际上它们完全是不同的概念。框架、设计模式这两个概念总容易被混淆,其实它们之间还是有区别的。框架通常是代码重用,而设计模式是设计重用,架构则介于两者之间,部分代码重用,部分设计重用,有时分析也可重用。在软件生产中有三种级别的重用:内部重用,即在同一应用中能公共使用的抽象块;代码重用,即将通用模块组合成库或工具集,以便在多个应用和领域都能使用;应用框架的重用,即为专用领域提供通用的或现成的基础结构,以获得最高级别的重用性。框架与设计模式虽然相似,但却有着根本的不同。设计模式是对在某种环境中反复出现的问题以及解决该问题的方案的描述,它比框架更抽象;框架可以用代码表示,也能直接执行或复用,而对模式而言只有实例才能用代码表示;设计模式是比框架更小的元素,一个框架中往往含有一个或多个设计模式,框架总是针对某一特定应用领域,但同一模式却可适用于各种应用。可以说,框架是软件,而设计模式是软件的知识。

(1)框架模式有哪些?MVC、MTV、MVP、CBD、ORM等等;

(2)设计模式有哪些?工厂模式、适配器模式、策略模式等等(代理,target-action,通知,单例,KVO)简而言之:设计模式是大智慧,用来对软件设计进行分工;框架模式是小技巧,对具体问题提出解决方案,以提高代码复用率,降低耦合度。

9。什么OOP?

OOP的三大特征以及具体含义。面向对象编程(ObjectOrientedProgramming,OOP,面向对象程序设计)是一种计算机编程架构。OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。

1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。

2.继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

3.封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。

10.列举所有的手势类。

1、拍击UITapGestureRecognizer(任意次数的拍击)2、向里或向外捏UIPinchGestureRecognizer(用于缩放)3、摇动或者拖拽UIPanGestureRecognizer4、擦碰UISwipeGestureRecognizer(以任意方向)5、旋转UIRotationGestureRecognizer(手指朝相反方向移动)6、长按UILongPressGestureRecognizer


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值