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

1、#import和#include的区别,@class代表什么?

  

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

(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中声明的类进来.

2、浅拷贝和深拷贝区别是什么?

浅拷贝

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

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

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

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;
}

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

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

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

6、NSMuatableArray *array = [NSMuatableArray array] 需要释放么?

7、@property本质是什么

8、delegate用什么属性修饰,ARC下与MRC下有何不同,为什么?

9、NSString,NSArray,NSMutableArray分别用什么属性修饰,原因是什么?

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

11、__block与__weak的区别是什么?

12、assign与weak的区别是什么?

13、分别写一个setter方法

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

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

15、如何写一个单例?

16、post与get的区别?

17、Http与tcp,udp的区别?

18、http都设置哪些header?

19、http与https的区别?

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

21、常用多线程方式有哪些?

22、NSOperation比GCD有哪些优点,如何处理线程依赖

23、runloop与线程的关系

24、runtime的理解

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

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

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

28、有一个需求,需要将N个请求全部完成之后执行某个操作,该如何处理

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

30、autorelease pool的原理是什么

31、runloop的原理

32、runloop与autoreleasepool的关系

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

34、SSL加密流程

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

36、AFnetworking原理

37、SDWebImage框架原理以及是如何做图片缓存的

38、冒泡排序/快速排序算法

39、CALayer与UIView的区别是什么?

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

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

42、instancetype与id的区别

43、如何进行代码适配

44、xib如何处理动态view布局

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

46、自己自定义一个轮播图

47、如何进行热修复?

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

49、如何进行自动化打包?

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

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

52、block比delegate有哪些优缺点

53、FMDB是线程安全的么?

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

 

原文地址:https://www.cnblogs.com/xiaohaoweiye/p/5633449.html