【※※※】Objective-C 的类可以多重继承吗?可以实现多个接口吗?Category是什么?重写一个类的方法是用继承好还是分类好?为什么?
答案:Objective-C 的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++的多重继承; Category是类别,一般情况用分类好,用Category去重写类的方法,仅对Category有效,不会影响到其它类与原有类的关系。
【※※※】我们说的OC是动态运行时语言是什么意思?
答案:多态。主要是将数据类型的确定由编译时,推迟到了运行时。
这个问题其实牵涉及到两个概念,运行时和多态。
简单来说,运行时机制使我们直到运行时才会去决定一个对象的类别,以及调用该类别对象指定方法。
多态:不同对象以自己的的方式响应相同的消息的能力叫做多态。意思就是假设生物类(life)都用有一个相同的方法-eat;
那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需要调用各自的eat方法。
也就是不同的对象以自己的方式响应了相同的消息(响应了eat这个选择器)。
因此也可以说,运行时机制是多态的基础。
【※※※】关于多态性
答案:不同对象以自己的方式响应相同的消息的能力叫多态;多态,子类指针可以赋值给父类。
【※※※】初始化的规则
答案:1、类会继承父类所有的初始化方法,也可以为类加入任意数量的初始化方法;
2、每个类都要选定一个指定初始化方法;
3、在执行其他初始化工作之前,必须先用指定初始化方法调用父类的指定初始化方法(直接或间接);
4、其他初始化方法要调用指定初始化方法(直接或间接);
5、如果某个类所声明的指定初始化方法与其父类的不同,就必须覆盖父类的指定初始化方法并调用新的指定初始化方法(直接或间接)。
【※※※】obj-c有私有方法么?私有变量呢?
答案:Objective-C——类里面的方法只有两种,静态方法和实例方法。这似乎就不是完整的面向对象了,按照OO的原则就是一个对象只暴露有用的东西。如果没有了私有方法的话,对于一些小范围的代码重用就不那么顺手了,在类里面声明了一个私有方法
@interface Controller:NSObject {NSString * something;}
+ (void)thisIsAStaticmethod;
- (void)thisIsAnInstanceMethod;
@end
@interface Controller(private)
- (void)thisIsAPrivateMethod;
@end
@private可以用来修饰私有变量
在Objective-C中,所有实例变量默认都是私有的,所有实例方法默认都是公开的
【※※※】super是如何工作的?
答案:通常情况下,当某个对象收到消息时,系统会先从这个对象德尔类开始,查询和消息名相同的方法名。如果没有找到,则会在这个对象的父类中继续查找。该查询过程会沿着继承路径上,直到找到相应的方法名为止(如果直到层次结果的顶端也没有找到合适的方法,程序就会抛出异常)。
向super发消息,其实是向self发送消息,但是要求系统在查找方法时跳过当前对象的类,从父类开始查询。以BNRItem的指定初始化方法为例,向super发送init消息会调用NSObject的init。
【※※※】以下对类的描述不正确的是:
A、类的接口部分可以包含实例变量、属性和方法。
B、可以把声明和实现都放到.h文件中。
C、一对文件(Person.h Person.m)只能定义一个类
D、类比较抽象,对象比较具体。
答案:C
解析:一个文件可以定义多个类。
【※※※】 #import跟#include有什么区别,@class呢?#import<>跟#import""又有什么区别?
答案:#import是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入,相当于#include和#progmaonce;@class告诉编译器某个类的声明,当执行时,才会去查看类的实现文件,可以解决头文件的相互包含;#import<>用来包含系统的头文件,#import""用来包含用户的头文件。
【※※※】下列不属于Objective-C中限定词的是
A、const
B、long
C、short
D、signed
答案:A
解析:Objective-C中的限定词有:long、long long、 short、unsigned、signed。const是C语言中的。
【※※※】下列哪个选项与@synthesize配合使用:
A、@end。
B、@interface
C、@implementation。
D、@property
答案:D
解析:Objective-C语言关键词,@property与@synthesize配对使用。
功能:让编译器自动编写一个与数据成员同名的方法声明来省去读写方法的声明。
【※※※】@synthesize和@dynamic分别有什么作用?
答案:
1)、@property有两个对应的词,一个是@synthesize,一个是@dynamic。如果@synthesize和@dynamic都没写,那么默认的就是@synthesize var = _var;
2)、@synthesize的语义是如果你没有动手实现setter方法和getter方法,那么编译器会自动为你加上这两个方法;
3)、@dynamic告诉编译器:属性的setter于getter方法由用户自己实现,不自动生成。(当然对于readonly的属性只需要提供getter即可)。假如一个属性被声明为@dynamic var,然后你没有提供@setter方法和@getter方法,编译的时候没问题,但是当程序运行到instance.var = someVar,由于缺setter方法会导致程序崩溃;或者当运行到someVar = var时,由于缺getter方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定。
【※※※】id声明的对象有什么特性?
答案:id声明的对象具有运行时特性,即可以指向任意类型的Objective-C的对象。
【※※※】原子(atomic)跟非原子(nonatomic)属性有什么区别?
答案:1、atomic:提供多线程安全,是防止在写未完成的时候被另外一个线程读取,造成数据错误;
2、nonatomic:在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了nonatomic,那么访问器只是简单地返回这个值。
【※※※】@protocol和category中如何使用@property
答案:
1)在protocol中使用property只会生成setter和getter方法声明,我们使用属性的目的,是希望遵守我协议的对象能实现该方法;
2)category使用@property也是只会生成setter和getter方法的声明,如果我们真的需要给category增加属性的实现,需要借助于运行时的两个函数: ①objc_setAssociatedObject ②objc_getAssociatedObject
【※※※】关键字volatile有什么含义?并给出三个不同的例子。
答案:一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
下一个是volatile变量的几个例子:
并行设备的硬件寄存器(如:状态寄存器)
一个中断服务子程序中会访问到非自动变量(Non-automatic variables)
多线程应用中被几个服务共享的变量
【※※※】属性readwrite,readonly,assign,retain,copy,nonatomic各是什么作用,在哪种情况下用?
答案:1)、readwrite是可读可写特性;需要生成getter方法和setter方法时;
2)、readonly是只读特性;只会生成getter方法,不会生成setter方法;不希望属性在类外改变;
3)、assign是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;
4)、retain表示持有特性,setter方法将传入参数先保留,在赋值,传入参数的retainCount会+1;
5)、copy表示赋值特性,setter方法将传入对象复制一份;需要完全一份新的变量时;
6)、nonatomic非原子操作,决定编译器生成的setter getter是否是原子操作,atomic表示多线程安全,一般使用nonatomic。
【※※※】frame与bounds的区别
答案:(1)frame指的是:该view在父view坐标系统中的位置和大小(参照点是父试图的坐标系统);(2)bounds指的是:该view在本身坐标系统中的位置和大小(参照点是本身的坐标系统)。
【※※※】写出下面程序段的输出结果:
NSString * aString = [[NSString alloc]initWithString:@"123"];
[aString autorelease];
NSMutableArray * arr = [NSMutableArray array];
[arr addObject:aString];
NSLog(@"string = %lu",[aString retainCount]);
A、1。
B、0.
C、整形最大值、
D、2、
答案:C
解析:因为“123”为字符串常量,系统不会收回,也不会对其作引用计数,即使我们队name如何retain或release。都是打印-1或2137483647
【※※※】下列说法错误的是
A、NSInteger是一个封装
B、NSInteger会自动识别当前操作系统的位数。
C、NSInteger自动返回最大的值。
D、NSInteger与int/long等价。
答案:D
解析:32位系统NSInteger是一个int,即32位;但当是64位系统时,NSInteger便是64位的。
【※※※】如何理解MVC设计模式?
答案:MVC是一种架构设计;M表示业务模型,V表示用户界面,C表示控制器,使用MVC的目的是将数据和试图的实现代码分离,从而使同一个程序可以使用不同的表现形式;比如一批统计数据可以分别用柱状图、饼图来表示;C存在的目的则是确保数据和试图的同步,一旦数据改变,试图应该同步更新。
【※※※】使用imageNamed方法创建UIImage对象时,与普通的init方法有什么区别?
答案:imageNamed方法将图片加载到内存中后不再释放。
【※※※】解析XML文件有哪几种方式?
答案:以DOM方式解析XML文件;以SAX方式解析XML文件。
【※※※】什么时候使用NSMutableArray,什么时候使用NSArray?
答案:当数组在程序运行时,需要不断变化的,使用NSMutableArray,当数组在初始化后,便不再改变的,使用NSArray。需要指出的是,使用NSArray只表明的是该数组在运行时不发生改变,即不能往NSArray的数组里新增和删除元素,但不表明其数组内的元素的内容不能发生改变。NSArray是线程安全的,NSMutableArray不是线程安全的,多线程使用到NSMutableArry需要注意。
【※※※】Block实现原理
答案:Objective-C是对C语言的扩展,block的实现是基于指针和函数指针。
从计算语言的发展,最早的goto,高级语言的指针,到面向对象语言的block,从机器的思维,一步步接近人的思维,以方便开发人员更为高效、直接的描述出现实的逻辑(需求)。
使用实例 cocoaTouch框架下动画效果的block的调用
使用typed声明block
typedef void(^didFinishBlock)(NSObject * ob);
这就声明了一个didFinishBlock类型的block,然后便可用@property (nonatomic,copy) didFinishBlock finishBlock;
声明一个block对象,注意对象属性设置为copy,接到block参数时,便会自动复制一份。
__block是一种特殊类型,使用该关键字声明的局部变量
【※※※】怎样实现推送服务?
答案:推送服务要实现是几个方面:(1)完成推送功能的注册请求,即在程序启动时弹出是否使用推送功能;(2)实现的程序启动是通过推送消息窗口触发的,在这里可以处理推送内容;(3)接收从苹果服务器返回的唯一的设备token,该token是推送服务器发送推送消息的依据,所以需要发送回推送服务器保存;(4)接收到推送消息,解析处理。
【※※※】UITableView的重用机制
答案:UITableView通过重用单元格来达到节省内存的目的:通过为每个单元格指定一个重用标识符(reuseIdentifier),即制定了单元格的种类,以及当单元格滚出屏幕时,允许恢复单元格以便重用。对于不同种类的单元格使用不同的ID,对于简单的表格,一个标识符就够了。
【※※※】断点续传需要在请求头中添加的控制续传最重要的关键字是
答案:请求头Range。
【※※※】什么是NSManagedObject模型?
答案:NSManagedObject是NSObject的子类,也是Coredata的重要组成部分,它是一个通用的类,实现了Coredata模型层所需要的基本功能,用户可通过子类化NSManagedObject,建立自己的数据模型。
【※※※】什么是KVO和KVC?
答案:KVC:键-值编码是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制。
kVO:键值观察机制,它提供了观察某一属性变化的方法,极大的简化了代码。
【※※※】Objective-C堆和栈的区别?
答案:管理方式:对于栈来讲,是由编译器自动管理,无需我们手动控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。
申请大小:
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在Windows下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
堆:堆是向搞地质扩展的数据结构,是不连续的内存区域。这是由于系统是链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,它们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出。
分配方式:堆是动态分配的,没有静态分配的堆。栈有两种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,它的动态分配是由编译器进行释放,无需我们手工实现。
分配效率:栈是机器系统提供的数据结构,计算机会在底层堆栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆这是C/C++函数库提供的,它的机制使很复杂的。
【内存管理】
【※※※】内存管理的几条原则,按照默认法则,哪些关键字生成的对象?
答案:需要手动释放?在property结合的时候怎样有效的避免内存泄露?
谁申请,谁释放;
遵循 Cocoa Touch 的使用原则:
内存管理主要要避免“过早释放”和“内存泄露”,对于“过早释放”需要注意@property设置特性时,一定要用对特性关键字,对于“内存泄露”,一定要申请了要负责释放,要细心。 关键字alloc或new生成的对象需要手动释放;设置正确的property属性,对于retain需要在合适的地方释放。
【※※※】下列关于内存管理说法正确的是
A、发送一条release消息对象就会销毁
B、系统向对象发送一条dealloc消息来释放他所占的内存,对象不一定销毁
C、若你的方法中不再需要一个对象时,但需要返回它,可发送一条autorelease消息来加入自动释放池
D、若使用alloc或copy方法来直接创建对象,不需要由你释放他
答案:C
解析:1、释放对象,可以释放其所占的内存,规则是:不在使用创建或者保持的对象时,就释放它们。2、发送一条release消息不一定销毁对象,只有引用计数变为0时,才会销毁这个对象。系统向对象发送一条dealloc消息来释放它所占的内存。3、自动释放池在释放释放池本身的时候自动释放池中的对象。系统向每个对象发送一条dealloc消息来释放它所占的内存。4、若你的方法中不再需要一个对象时,但需要返回它,可发送一条autorelease消息来加入自动释放池。5、若使用alloc或copy方法(或使用allocWithZone:、copyWithZone:或mutableCopy方法来直接创建对象,则由你负责释放它。每次retain对象时,应该release或autorelease它。)
【※※※】下列说法错误的是
A、在OC的对象中存有引用计数这一整数值。
B、调用alloc或retain方法后,引用计数值加1。
C、引用计数值为0时,对象自动销毁。
D、调用release后,引用计数值减1.
答案:C
解析 : 引用计数值为0时,调用dealloc方法废弃对象。
【※※※】下列说法错误的是
A、autorelease类似于C语言中的自动变量,当超出其作用域时对象实例的release实例方法被调用。
B、如果NSAutoreleasePool被嵌套使用,那么会使用最外侧的。
C、大量使用autorelease对象时,容易导致内存不足现象。
D、Cocoa框架中很多类方法用于返回autorelease的对象。
答案:B
解析:如果NSAutoreleasePool被嵌套使用,那么会使用最内侧的。
【※※※】下列说法错误的是
A、autorelease NSAutoreleasePool对象不会发生异常。
B、如果NSAutoreleasePool被嵌套使用,那么会使用最内侧的。
C、对象调用autorelease方法实现上调用的都是NSObject的autoreleasse实例方法,但NSAutoreleasePool类的autorelease实例方法已被该类重载,因此运行时就会出错。
D、大量产生autorelease对象时,只要不废弃NSAutoreleasePool对象,生成的对象就不能被释放,有时会产生内存不足的现象。
答案:A
解析:对象调用autorelease方法实现上调用的都是NSObject的autorelease实例方法,但NSAutoreleasePool类的autorelease实例方法已被该类重载,因此运行时就会出错。
【※※※】下列说法错误的是
A、同一程序中按文件单位可以选择ARC有效/无效。
B、设置ARC有效的编程方法是指定编译器属性为-fobjc-arc。
C、ARC无效:-fno-objc-arc。
D、ARC项目中可以使用手动内存管理协的第三方类。
答案:D
解析:通过设置ARC有效的编译方法。
【进程与线程】
【※※※】runloop和线程有什么关系?
答案:总的来说,Run loop,正如其名,loop表示某种循环,和run放在一起就表示一直在运行着的循环,实际上,run loop和线程是紧密相连的,可以这样说run loop是为了线程而生的,没有线程,它就没有存在的必要的。Run loop是线程的基础构架部分,Cocoa 和CoreFundation都是提供了run loop对象方便配置和管理线程的run loop(一下都以Cocoa为例)。每个线程,包括程序的主线程(main thread)都有与之对应的run loop对象。
【※※※】下列不是死锁的处理方法是
A、鸵鸟策略。
B、预防策略。
C、避免策略。
D、请求保持。
答案:D
解析:请求保持是死锁的条件。
【※※※】死锁的四个必要条件
答案:互斥、请求保持、不可剥夺、环路。
【※※※】进程死锁的原因
答案:资源竞争及进程推进顺序非法。
【协议】
【※※※】TCP/IP协议的层次结构
答案:TCP/IP协议主要层次结构为:应用层/传输层/网络层/数据链路层/物理层。
【※※※】TCP和UDP的区别
答案:TCP全称是Transmission Control Protocol,中文名为传输控制协议,它可以提供可靠的、面向连接的网络数据传递服务。传输控制协议主要包含下列任务和功能:
*确保IP数据报的成功传递。
*对程序发送的大块数据进行分段和重组。
*确保正确排序及按顺序传递分段的数据。
*通过计算校验和,进行传输数据的完整性检查。
TCP提供的面向连接的、可靠的数据流传输,而UDP提供的是非面向连接的,不可靠的数据流传输。
简单的说,TCP注重数据安全,而UDP数据传输快点,但安全性一般。
【※※※】HTTP协议的主要特点是什么?
答案:HTTP协议是短连接,都是客户端主动发送请求,服务器做出响应,服务器响应之后,链接则断开(1)支持客户/服务器模式;(2)简单快速:客户向服务器请求服务时,只需要传送请求方法和路径。请求方法常有的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。 由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快;(3)灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。(4)无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。(5)无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要面对的信息,则它必须重传,这样可能导致每次连接传送的数量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
【※※※】HTTP协议中的GET请求与POST请求的区别?
答案;(1)GET请求没有请求体,POST请求有请求体,请求参数可以放入请求体中,所以POST可以提交大量的数据给服务器。(2)Get请求直接从服务器拿数据,性能好,效率高,在地址栏会显示所有的参数,从直观上安全性不高,由于Get不提交数据给服务器,因此实际上的安全性是很高的,实际应用:数据查询;Post请求,需要先弄一个数据体,将数据体提交给服务器,才能获取到服务器的响应,性能不好,效率低,不会再地址栏显示参数,直观上安全性高,由于Post请求会提交数据给服务器,有可能会存在安全漏洞,实际的安全性不高,实际应用:用户登录、上传文件等需要与服务器进行数据交互的操作,才需要使用到Post操作。
【※※※】关于协议叙述错误的是
A、协议的声明类似于类借口的声明,有一点不同的是,协议没有父类,并且不能定义成员变量。
B、如果一个类遵守某项协议,那么它的子类也遵守该协议。
C、协议引用NSObject类。
D、定义一项协议时,可以扩展现有协议的定义。
答案:C
解析:协议不引用任何类,它是无类的(classless)。任何类都可以遵守某项协议。
【算法】
【※※※】算法的时间复杂度是指
答案:所谓算法的时间复杂度,是指执行算法所需要的计算工作量(算法执行过程中所需要的基本运算次数)。
【流媒体】
【※※※】fmmpeg框架
答案:音视频编解码框架,内部使用UDP协议针对流媒体开发,内部开辟了六个端口来接受流媒体数据,完成快速接受之目的。
【※※※】在线播放视频一般访问服务器中的哪类型文件
答案:在线播放视频一般访问服务器中的M3U8类型文件