ios面试题

1.  Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?

Object-c的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++的多重继承;Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。

 

2.#import跟#include 又什么区别,@class呢,#import<> 跟 #import”"又什么区别?

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

 

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

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

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

assign是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;

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

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

nonatomic非原子操作,决定编译器生成的setter getter是否是原子操作,atomic表示多线程安全,一般使用nonatomic


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

编译时是NSString的类型;

运行时是NSData类型的对象;

 

5.常见的object-c的数据类型有那些, 和C的基本数据类型有什么区别?如:NSInteger和int;

object-c的数据类型有NSString,NSNumber,NSArray,NSMutableArray,NSData等等,这些都是class,创建后便是对象,而C语言 的基本数据类型int,只是一定字节的内存空间,用于存放数值;而object-c的NSNumber包含有父类NSObject的方法和 NSNumber自己的方法,可以完成复杂的操作。

 

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

Id 声明的对象具有运行时的特性,即可以指向任意类型的objcetive-c的对象;

 

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

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

 

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

谁申请,谁释放

遵循CocoaTouch的使用原则;

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

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

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


9.autorelease的对象,在什么时候会释放,autorelease又 在什么时候使用比较合适呢?

autoreleaserelease的调用延迟了。autorelease会将对象放入autoreleasepool中,当pool释放时,所有对象都会被release。当从一个方法中返回对象时,因为无法使用 release,所以使用autorelease比较合适。


10.代理一般是什么时候用呢?

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

11.有关 copy 和 retain 的区别

答:retain是指针拷贝,copy是内容拷贝


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

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


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

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


14.浅复制和深复制的区别?

 

答案:

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

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


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

答案:

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

类别主要有3个作用:

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

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

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

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


16.类别和类扩展的区别。


答案:

categoryextensions的不同在于 后者可以添加属性。

另外后者添加的方法是必须要实现的。

extensions可以认为是一个私有的Category


17.谈谈 KVO and KVC?
答案:

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

kvo:键值观察机制,他提供了观察某一属性变化的方法,极大的简化了代码。具体用看到嗯哼用到过的一个地方是对于按钮点击变化状态的的监控。


18.framebounds有什么不同?


答案:

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

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


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

Objective-c 只支持单继承,如果要实现多继承的话,可以通过类别和协议的方式来实现, cocoa 中所有的类都是 NSObject 的子类,多继承在这里是用 protocol 委托代理 来实现的。

20. MVC是什么?
答案: MVC 设计模式考虑三种对象:模型对象、视图对象、和控制器对象。模型对象代表 特别的知识和专业技能,它们负责保有应用程序的数据和定义操作数据的逻辑。视图对象知道如何显示应用程序的模型数据,而且可能允许用户对其进行编辑。控制 器对象是应用程序的视图对象和模型对象之间的协调者。     


21.自动释放池跟GC(垃圾回收)有什么区别?iPhone上有GC么?[pool release和[pool drain]有什么区别?

iPhone
上没有 GC iPhone 开发的时候没有垃圾回收机制。
在垃圾回收环境中, release 是一个空操作。因此, NSAutoreleasePool 提供了 drain 方法,在引用计数环境中,该方法的作用等同于调用 release ,但在垃圾回收环境中,它会触发垃圾回收(如果自上次垃圾回收以来分配的内存大于当前的阈值)。因此,在通常情况下,您应该使用 drain 而不是 release 来销毁自动释放池。     



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

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


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

答:

self.name ="object"会调用对象的setName()方法,

name ="object"会直接把object赋值给当前对象的name 属性。

 并且self.name 这样retainCount会加1,而name就不会。






其他类型小谈面试题:

1.讲讲OC和其他语言好在哪里,不好在哪里

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

缺点:
1) 不⽀支援命名空間 

2) 不⽀支持运算符重载 

3)不⽀支持多重继承 


2.SEL和一个函数指针调用同一个方法的结果是不是相同

 答:得到了SEL变量之后,可以通过下⾯面的调⽤用来给⼀一个对象发送消息:

[对象performSelector:SEL变量withObject:参数1 withObject:参数2];

结论:SEL只是⽅方法名标识,实际运⾏行时需要通过消息发送来调⽤用,IMP是”implementation”的缩 写,它是objetive-C ⽅方法 (method)实现代码块的地址,类似函数指针,通过它可以 直接访问任意⼀一个⽅方法。免去发送消息的代价。


3.project workspace scheme的区别

Project:
⼀一般的某个应⽤用单独新建⼀一个project就可以了,然后把所有的程序⽂文件都放在⾥里⾯面,这个可以满⾜足⼤大部分普通的需求。

Workspace:
项⺫⽬目有可能要使⽤用其他的项⺫⽬目⽂文件,或者引⼊入其他的静态库⽂文件,这个时候workspace就派上⽤用场了,workspace既可以单独管理多个项⺫⽬目,⼜又可以通过配置,让各个项⺫⽬目相互依赖。

Scheme:

Xcode scheme定义了编译集合中的若干target,编译时的⼀一些设置以及要执⾏行的测试集合。可以⾃自定义若干个scheme,但是同⼀一时刻只能运⾏行⼀一个。 

4.把你知道的framework写出来 写出功能

UIKit.framework 包含iOS应用程序用户界面层使用的类和方法。

CoreGraphics.framework 包含Quartz 2D 绘图API 接口

Foundation.framework CoreFoundation 框架的许多功能提供Objective-C 封装。

CoreFoundation.framework 一组C 语言接口,它们为iOS 应用程序提供基本数据管理和服务功能。

MapKit.framework 该框架供一个可被嵌入到应用程序的地图界面,该界面包含一个可以滚动的地图视图。

CoreLocation.framework 可用于定位某个设备当前经纬度。

CFNetwork.framework提供一组高性能基于C 语言的接口,它们为使用网络协议提供面向对象抽象。 

5.const的用法?

(1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了; 

(2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const; 

(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;

(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数, 不能修改类的成员变量;

(5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其 返回值不为“左值”。 


6.ios平台怎么做数据的持久化?coredatasqlite有无必然联系?coredata是一个关系型数据库吗?


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值