1、ios线程并发需要注意什么
(1)多线程
CPU在同一时间只能执行一个线程,之所以看起来多个线程能同时进行工作,
这是因为CPU在多个线程之间来回切换的原因,如果cpu来回切换的速度够快,
就造成了多线程并发执行的假象。(所以线程不能开太多)
(2)资源共享
1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源
比如多个线程访问同一个对象、同一个变量、同一个文件
当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题(卖票存取款)
解决方案:
互斥锁:@synchronized(锁对象) { // 需要锁定的代码 }
注意:锁定1份代码只用1把锁,用多把锁是无效的
1)NSLock(互斥锁)
2) NSRecursiveLock(递归锁)
条件锁,递归或循环方法时使用此方法实现锁,可避免死锁等问题。
3) NSConditionLock(条件锁)
使用此方法可以指定,只有满足条件的时候才可以解锁。
4)NSDistributedLock(分布式锁)
(原来有这么多的锁)
提个问题:如果某个ViewController里运行了一个Thread,Thread还没结束的时候,
这个ViewController被Release了,结果会如何?
经过的的测试,Thread不结束,ViewController一直保留,不会执行dealloc方法。
2、iOS图片缓存怎么操作
SDWebImage底层实现有沙盒缓存机制,主要由三块组成
1、内存图片缓存
2、内存操作缓存
3、磁盘沙盒缓存
先从内存图片缓存查找是否有图片,如果有显示,内存缓存没有的话,添加队列从硬盘查找图片是否有缓存。
如果读到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)
然后显示图片。如果硬盘还是没找到,说明所有的缓存都不存在该图片,需要下载图片,
图片下载完成保存到SDImageCache,内存缓存和硬盘缓存同时保存。
3、如何做App内存优化和代码优化
内存优化:
1、ARC管理内存
2、cell的重用
3、不要阻塞主线程
4、懒加载
5、Cache(图片缓存)
6、优化UITableView
正确使用`reuseIdentifier`来重用cells
·尽量使所有的view opaque,包括cell自身
· 避免渐变,图片缩放,后台选人
· 缓存行高
· 如果cell内现实的内容来自web,使用异步加载,缓存请求结果
·使用`shadowPath`来画阴影
· 减少subviews的数量
· 尽量不适用`cellForRowAtIndexPath:`,如果你需要用到它,只用一次然后缓存结果
· 使用正确的数据结构来存储数据
· 使用`rowHeight`, `sectionFooterHeight`和 `sectionHeaderHeight`来设定固定的高,不要请求delegate
7、正确处理数据存储(缓存、沙盒、归档、CoreData,数据库)
代码优化:
1、封装
4、MVC的理解与使用
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写
C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。
5、JS和OC的交互
这个代理函数的主要工作就是做本地拦截和处理,比如你跟服务端协商了一个协议,这个协议也就是当webview上点击了某个按钮后,服务器该如何发送一个requset,当我们在这个函数里发现了这个requestString,然后调用相应的OC代码,就可以了,注意return NO的意思就是不执行webview上本应该有的跳转。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSString *requestString = [[[request URL] absoluteString] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding ];
NSLog(@"requestString=%@",requestString);
return NO;
}
那么我们也会遇到怎么调用webview里的js呢,这个就可以使用
[webView stringByEvaluatingJavaScriptFromString:@"js函数"];
文/梅庆(简书作者)
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
6、浅复制和深赋值的区别
NSString s1=@”111”;
NSString s2=s1;
S2=@”222”;
浅复制: s1,s2 都发生改变
深复制:就s2发生改变
浅复制:共享同一个内存空间,若内容发生改变 则两个变量都改变
(在有指针的情况下,只是增加了一个指针指向一个已经存在的内存空间)复制指针
深复制:把这个内容复制一遍 并且开辟了一段新的空间 两个数是在不同的内存空间里面
(增加一个指针并且申请了一个新的内存)
7、利用Socket建立网络连接的步骤
(建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。
套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。
1、服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。
2、客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。
为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
3、连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。
而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。)
8、并发和并行
在单CPU系统中,系统调度在某一时刻只能让一个线程运行,虽然这种调试机制有多种形式(大多数是时间片轮巡为主),
但无论如何,要通过不断切换需要运行的线程让其运行的方式就叫并发(concurrent)。而在多CPU系统中
,可以让两个以上的线程同时运行,这种可以同时让两个以上线程同时运行的方式叫做并行(parallel)。
9、nil,Null的区别?
nil是OC的空 NULL是C语言的空(空对象是可以调用方法)
nil 只针对对象
NULL 是针对指针
NSNull:在集合对象中,表示空值的对象
空指针是指该指针未指向一块有意义的内存区。如int *p; int *p = NULL;
Objective-C在C的表达不存在的基础上增加了nil。nil是一个指向不存在的对象指针。
Foundation定义了NSNull,即一个类方法+null,它返回一个单独的NSNull对象。NSNull与nil以及NULL不同,因为它是一个实际的对象,而不是一个零值。
Nil被定义为指向零的类指针。
10、id声明的对象有什么特征
id 类型的对象可以是任何类型的OC对象,与C的void*万能指针相似
具有运行时的特点,运行时候才确定对象的类型
编译的时候不会报错。