一、#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从哪些方面进行流畅度优化?