iOS面试题 -总结 ,你的基础扎实吗?

一、#import和#include的区别,@class表明什么?ios

  

(1)#import指令是Object-C针对#include的改进版本,#import确保引用的文件只会被引用一次,这样你就不会陷入递归包含的问题中。web

(2)#import与@class两者的区别在于:算法

#import会链入该头文件的所有信息,包括实体变量和方法等;而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定 义的,暂时不用考虑。在头文件中, 通常只须要知道被引用的类的名称就能够了。 不须要知道其内部的实体变量和方法,因此在头文件中通常使用@class来声明这个名称是类的名称。 而在实现类里面,由于会用到这个引用类的内部的实体变量和方法,因此须要使用#import来包含这个被引用类的头文件。缓存

在编译效率方面考虑,若是你有100个头文件都#import了同一个头文件,或者这些文件是依次引用的,如A–>B, B–>C, C–>D这样的引用关系。当最开始的那个头文件有变化的话,后面全部引用它的类都须要从新编译,若是你的类有不少的话,这将耗费大量的时间。而是用 @class则不会。安全

若是有循环依赖关系,如:A–>B, B–>A这样的相互依赖关系,若是使用#import来相互包含,那么就会出现编译错误,若是使用@class在两个类的头文件中相互声明,则不会 有编译错误出现。因此,通常来讲,@class是放在interface中的,只是为了在interface中引用这个类,把这个类做为一个类型来用的。 在实现这个接口的实现类中,若是须要引用这个类的实体变量或者方法之类的,仍是须要import在@class中声明的类进来.网络

二、浅拷贝和深拷贝区别是什么?多线程

浅拷贝app

浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。如:框架

1
2
char* str = (char*)malloc(100);
char* str2 = str;

浅拷贝只是对对象的简单拷贝,让几个对象共用一片内存,当内存销毁的时候,指向这片内存的几个指针须要从新定义才可使用,要否则会成为野指针。tcp

iOS 里面的浅拷贝:

在 iOS 里面, 使用retain 关键字进行引用计数,就是一种更加保险的浅拷贝。他既让几个指针共用同一片内存空间,又能够在release 因为计数的存在,不会轻易的销毁内存,达到更加简单使用的目的。

深拷贝:

深拷贝是指拷贝对象的具体内容,而内存地址是自主分配的,拷贝结束以后,两个对象虽然存的值是相同的,可是内存地址不同,两个对象也互不影响,互不干涉。

copy 与 retain 的区别:

copy 是建立一个新对象,retain 是建立一个指针,引用对象计数加一。 copy属性标识两个对象内容相同,新的对象retain count为1, 与旧有对象引用计数无关,旧有对象没有变化。copy减小对象对上下文的依赖。

iOS里的深拷贝:

iOS提供了copy和mutableCopy方法,顾名思义,copy就是复制了一个imutable的对象,而mutableCopy就是复制了一个mutable的对象。如下将举几个例子来讲明。
这里指的是NSString, NSNumber等等一类的对象。

1
2
3
4
NSString *string = @”dddd";
NSString *stringCopy = [string copy];
NSMutableString *stringDCopy = [string mutableCopy];
[stringMCopy appendString:@ "!!" ];

查看内存能够发现,string和stringCopy指向的是同一块内存区域(weak reference),引用计数没有发生改变。而stringMCopy则是咱们所说的真正意义上的复制,系统为其分配了新内存,是两个独立的字符串内容是同样的。

拷贝构造:

固然在 ios 中并非全部的对象都支持copy,mutableCopy,遵照NSCopying协议的类能够发送copy消息,遵照NSMutableCopying协议的类才能够发送mutableCopy消息。

假 如发送了一个没有遵照上诉两协议而发送copy或者 mutableCopy,那么就会发生异常。可是默认的ios类并无遵照这两个协议。若是想自定义 一下copy 那么就必须遵照NSCopying,而且实现 copyWithZone: 方法,若是想自定义一下mutableCopy 那么就必须遵 守NSMutableCopying,而且实现 mutableCopyWithZone: 方法。

若是是咱们定义的对象,那么咱们本身要实现NSCopying , NSMutableCopying这样就能调用copy和mutablecopy了。举个例子:

1
2
3
4
5
6
7
8
@interface MyObj : NSObject<NSCopying, NSMutableCopying>{
     NSMutableString *_name;
     NSString * _imutableStr ;
     int _age;
}     
@property (nonatomic, retain) NSMutableString *name;
@property (nonatomic, retain) NSString *imutableStr;
@property (nonatomic) int age;

copy拷贝构造:

1
2
3
4
5
6
7
- (id)copyWithZone:(NSZone *)zone{
     MyObj *copy = [[[self class] allocWithZone :zone] init];
     copy->name = [_name copy];
     copy->imutableStr = [_imutableStr copy];
     copy->age = age;
     return  copy;
}

mutableCopy拷贝构造:

 

1
2
3
4
5
6
- (id)mutableCopyWithZone:(NSZone *)zone{
     MyObj *copy = NSCopyObject(self, 0, zone);
     copy->name = [_name mutableCopy];
     copy->age = age;
     return  copy;
}

三、Objective-C中类别和类扩展的区别?

四、Objective-C堆和栈的区别?

五、内存管理的几个原则是什么?

六、NSMuatableArray *array = [NSMuatableArray array] 须要释放么?

七、@property本质是什么

八、delegate用什么属性修饰,ARC下与MRC下有何不一样,为何?

九、NSString,NSArray,NSMutableArray分别用什么属性修饰,缘由是什么?

十、block用什么属性修饰,为何?

十一、__block与__weak的区别是什么?

十二、assign与weak的区别是什么?

1三、分别写一个setter方法

完成@property(nonatomic,retain)NSString *name和@property(nonatomic,copy)NSString *name

1四、@autoreleasepool {for (long i = 0; i < largeNumber; i++) {Person *per = [[Person alloc] init];[per autorelease];}}有什么内存问题,如何改正?

1五、如何写一个单例?

1六、post与get的区别?

1七、Http与tcp,udp的区别?

1八、http都设置哪些header?

1九、http与https的区别?

20、网络七层协议(http,tcp/ip处于哪一层)?

2一、经常使用多线程方式有哪些?

2二、NSOperation比GCD有哪些优势,如何处理线程依赖

2三、runloop与线程的关系

2四、runtime的理解

2五、在实际项目中遇到过死锁么?如何处理死锁问题

2六、runloop有几种模式,runloop接收几种输入源

2七、如何处理滑动UI过程当中,广告轮播图中止轮询问题,使用runloop的哪一种模式

2八、有一个需求,须要将N个请求所有完成以后执行某个操做,该如何处理

2九、weak会有性能开销么?使用什么代替

30、autorelease pool的原理是什么

3一、runloop的原理

3二、runloop与autoreleasepool的关系

3三、block会延长对象的生命周期么?

3四、SSL加密流程

3五、网络加密方式有哪些,各自的原理

3六、AFnetworking原理

3七、SDWebImage框架原理以及是如何作图片缓存的

3八、冒泡排序/快速排序算法

3九、CALayer与UIView的区别是什么?

40、iOS有几种动画,各自是什么?

4一、用熟悉的动画写一个移动的动画

4二、instancetype与id的区别

4三、如何进行代码适配

4四、xib如何处理动态view布局

4五、如何处理webview与js之间交互

4六、本身自定义一个轮播图

4七、如何进行热修复?

4八、对MVVM的理解以及如何实践

4九、如何进行自动化打包?

50、如何对网络请求进行二次封装

5一、好比开发人员要打发布包与企业包,如何在不修改bundle id的状况下快速打包?

5二、block比delegate有哪些优缺点

5三、FMDB是线程安全的么?

5四、tableview从哪些方面进行流畅度优化?

相关文章
相关标签/搜索