再接再厉,增强总结和表达能力!!!
1. static关键字
- static修饰局部变量,通过static修饰的函数或者变量,作用域仅限于当前文件,其它文件不可访问。
- 类方法不可以访问实例变量(函数),但是通过static修饰的可以被类方法访问
- static修饰的变量,能且只能被初始化一次
static修饰全局变量是不安全的,因为它可能会被外部修改,所以在定义全局变量时推荐使用extern关键字修饰。
引申extern关键字:
- extern修饰全局变量,也称之为外部变量,是在方法外部定义的变量。它不属于哪个方法,而是属于整个源程序。
- 作用域是整个源程序。
- 如果全局变量和局部变量重名,则在局部变量作用域内,全局变量被屏蔽,不起作用。编程时候尽量不使用全局变量。
2. http和https
3. TCP和UDP
4. 三次握手和四次挥手
5. OSI七层模型和TCP/IP五层模型(详细整理一下)
- 5.四道题整理的iOS网络相关答案
6. 进程和线程,线程之间是如何通信的,线程的几种状态
进程 是资源分配的基本单位,它是程序执行时的一个实例,在程序运行时创建。
线程 是程序执行的最小单位,是进程的一个执行流,一个进程由多个线程组成。
线程间通信的体现
1). 把1个线程传递数据给另1个线程
2). 在1个线程中执行完特定任务后,转到另1个线程继续执行任务
线程间通信常用方法
例:用GCD将一个线程的数据传递给另一个线程
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"donwload---%@", [NSThread currentThread]);
// 1.子线程下载图片
NSURL *url = [NSURL URLWithString:@"http://test.png"];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];
// 2.回到主线程设置图片
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"setting---%@ %@", [NSThread currentThread], image);
});
});
线程的几种状态
1.线程的创建 alloc
2.线程的启动 start
3.线程的运行/阻塞 sleep
4.线程的死亡(线程的任务结束、发生异常、强制退出)
5.强制停止线程 exit
7. weak作用及其实现原理
weak关键字的作用是弱引用,所引用对象的计数器不会加一,并在对象作用域外自动被设置为nil。
weak底层实现原理:
- 当一个对象
obj
被weak指针指向时,这个weak指针会被存储到以obj
作为key
的weak_table散列表上对应的一个weak指针数组里面。key
是对象地址,value
是weak指针数组。- 当一个对象
obj
的dealloc方法被调用时,Runtime会以obj
为key
,从sideTable的weak_table散列表中,找出对应的weak指针列表,然后将里面的weak指针逐个置为nil。
8. 响应链原理
当用户触摸屏幕时,触碰屏幕产生事件UIEvent并存入UIApplication中的事件队列中,在整个视图结构中自上而下的进行分发:UIApplication -> UIWindow -> UIViewController -> self.view -> subview。
比较重要的两个方法:
// 判断当前点击事件是否存在最优响应者(First Responder) - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event; // 判断当前点击是否在控件的Bounds之内 - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
- 第一个方法返回一个可以响应event触摸事件的UIView
- 第二个方法判断触摸点在不在可响应范围之内。
9. App启动过程
main函数执行前:
1.加载可执行文件(App里的所有.o文件)
2.加载动态链接库,进行rebase指针调整和bind符号绑定。
3.ObjC的runtime初始化。 包括:ObjC相关Class的注册、category注册、selector唯一性检查等。
4.初始化。包括:执行+load()方法、用attribute((constructor))修饰的函数的调用、创建C++静态全局变量等。main函数执行后:
5.从main函数到设置self.window.rootViewController执行完成
6.首屏初始化
10. 冒泡排序,快速排序,二分法排序的复杂度
冒泡排序时间复杂度O(n^2)
快速排序时间复杂度O(nlogn)
二分法排序时间复杂度O(logn)
11. 手写冒泡排序
var arr: [Int] = [2,4,3,1,6,8,10,7,5,9]
for i in 0..<arr.count {
for j in 0..<(arr.count-i-1) {
if (array[j] > array[j+1]) {
let temp = arr[j]
arr[j] = arr[j+1]
arr[j+1] = temp
}
}
}
for i in 0..<array.count {
print(array[i])
}
网友评论