Ios面试复习--碎片知识
1.@class
利用@class 可以简单的引用一个类
import “xxx” 是一个预编译指令,会将“ xxx ”的内容copy到import 所在的位置,并且import又一个特点,只有‘ xxx ’中的文件发生了变化,那么import 会重新copy一次
区别于import的是,@class XXX 只是声明XXX是一个类,并不会copy该类的内容
sososo 常见于在.h 中@class .m 中import
--1.可以提升编译效率
--2.解决循环依赖
2.MRC循环retain
MRC中引用计数为0时,释放该对象
循环retain 多见于两个对象互相引用对方,导致谁也不能被释放 既A retain B B retain A
解决循环引用的核心思路是减少一次引用 A retain B B assign A 或者交换
3.ARC中的循环retain
ARC中 不再有强指针指向该实例对象时,释放该对象
循环retain 多见于两个对象互相用强指针对方,导致谁也不能被释放 既A strong B B strong A
解决循环引用的核心思路是一方用弱指针指向对方即可A weak B B weak A 或者交换
注意,也可以使用assign ,但是不符合设计规范,assign 修饰符号,修饰非对象型变量
4.delegate 和 weak
修饰带有协议的指针 通常使用weak
修饰带有协议的指针
在遵循某协议时 时常会造成循环引用
控制器强引用tableview 而 tableview 的delegate 又被控制器遵循 易形成循环引用
将带有协议的指针 变成若引用既解决循环引用
5.ios 9 新特性 __kindof
__kindof 表示约束为该类或者其子类
6.Port 小众线程间的通信方式
NSPort NSMassagePort NSMachPort
主线程 和 子线程 互相持有对方的Port 进而进行通信
7.不利用中间变量交换两个变量的值
交换变量
8.#import "" <> 的区别
#import"xxx" 表示从当前项目路径开始寻找文件,如果找不到,则到系统(项目)中配置的头文件路径去找;
#import<>表示直接到系统(项目)中配置的头文件路径去找。
9.#include< > 和 "" 的区别
#include< > 引用的是编译器的类库路径里面的头文件。
假如你编译器定义的自带头文件引用在 C:\Keil\c51\INC\ 下面,则 #include 引用的就是 C:\Keil\c51\INC\stdio.h 这个头文件,不管你的项目在什么目录里, C:\Keil\c51\INC\stdio.h 这个路径就定下来了,一般是引用自带的一些头文件,如: stdio.h、conio.h、string.h、stdlib.h 等等。
二、#include" "
#include" " 引用的是你程序目录的相对路径中的头文件。
10.#include 、 #import 、@Class 的区别
#import和#include的区别
--1.使用场合不同
#import是导入Objective-C头文件的关键词,#include是导入C/C++头文件的关键词
--2.重复引用
使用#include需要处理重复引用,#import能防止同一个文件被多次包含,则不需要处理重复引用
#import和@class的区别:
--1.包不包含
#import会包含这个类的所有信息(包括实体变量和方法),而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,你现在不需要关心
--2.用与不用
在头文件中,一般只需要知道被引用的类的名称就可以了,不需要关心类内部细节,所有用@class
在实现文件中,会用到被引用类的内部的实体变量和方法,所以用#import来包含被引用类的头文件
--3.编译效率
假如你有100个头文件都#import了同一个头文件A,或者这些文件存在依赖关系:A–>B, B–>C, C–>D...。当头文件A发生改变的时候,后面所有引用它的类都需要重新编译,这是非常耗性能的。而用@class则不会。
--4.是否会产生循环依赖
假如有循环依赖关系:A–>B,B–>A,如果使用#import来相互包含,那么就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会有编译错误出现。
所以,一般来说,@class是放在interface中的,只是为了在interface中声明这个类。如果在@implementation中需要引用这个类的实体变量或者方法之类的,还是需要import在@class中声明的类进来.