
iOS面试
文章平均质量分 50
澄海单挑狂
一切努力,只为巅峰
展开
-
iOS多线程
1. 引入的异步技术有两个 GCD和Operation Queue1.1 Dispatch Queue按先进先出的顺序,串行或并发的执行任务serial dispatch queue一次只能执行一次任务concurrent dispatch queue则尽可能多的启动任务并发执行1.2 Dispatch Sources1.3 Operation Qu原创 2017-03-31 14:33:23 · 318 阅读 · 0 评论 -
RunLoop
RunLoop作用:1.保持程序运行 2.处理app各种事件 3.节省cpu资源,提高性能两个API NSRunLoop CFRunLoopRefRunLoop与线程1.每条线程都有唯一的与之对应的RunLoop对象2.主线程的RunLoop已经创建好了,而子线程的需要手动创建.3.RunLoop在第一次获取时创建,在线程结束时销毁RunLoop相关类CFRunLoopRefCFRunLoopMo...原创 2018-02-28 11:17:11 · 219 阅读 · 0 评论 -
RunLoop2
- (void)threadTest{ NSLog(@"--%@--", [NSThread currentThread]); [[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode]; [[NSRunLoop currentRunLoop] run];}一个线程对应一...原创 2018-02-28 17:51:53 · 192 阅读 · 0 评论 -
锁
谈下iOS开发中知道的哪些锁? 哪个性能最差?SD和AFN使用的哪个? 一般开发中你最常用哪个? 哪个锁apple存在问题又是什么问题?iOS开发中11种锁以及性能对比Data race: 当至少有两个线程同时访问一个变量, 至少有一个是写操作时, 就发生Data race例: 两个线程同时执行counter++ 产生数据竟跑, 造成的最终值为1load [%counter], rax; // 线...原创 2018-03-02 11:43:52 · 233 阅读 · 0 评论 -
线程池
iOS下如何实现指定线程数目的线程池?线程? 线程池? - -||| 又是一脸懵逼?分析:NSThread NSOperation GCD可以把NSOperationQueue看做一个线程池, 可往线程池中添加NSOperation到队列中可以控制线程依赖, 可以控制线程池的并发数Dispatch Queue的内存管理...原创 2018-03-02 14:55:54 · 319 阅读 · 0 评论 -
KVC KVO实现原理
KVO是Objective-C对观察者设计模式的一种实现指定一个被观察的对象, 当对象的某个属性发生改变时, 对象会获得通知当观察某对象A时, KVO机制动态创建一个对象A当前类的子类, 并为这个新的子类重写被观察属性keyPath的setter方法.setter方法随后负责通知观察对象属性的改变状况1. 被观察对象的isa指针从指向原来的A类,被KVO机制修改为指向系统新创建的_A类,来实现当前...原创 2018-03-12 10:07:20 · 398 阅读 · 0 评论 -
字符串为什么使用copy不使用strong
NSMutableString * name = [[NSMutableString alloc] initWithString:@"xiaoming"]; Person * p = [Person new]; p.name = name; NSLog(@"name is %@", p.name); [name appendString:@"123"]; NS...原创 2018-03-12 10:40:11 · 392 阅读 · 0 评论 -
__strong修饰符
在ARC环境下, 我们常常会使用weak的修饰符来修饰一个变量, 防止其在block中被循环引用, 但在特殊情况下,我们在block中又使用strong来修饰这个在block外刚刚用__weak修饰的变量在block中需要对weakSelf进行strong, 保证代码在执行到block中,self不会被释放, 当block执行完后, 会自动释放该strongSelf当加上修饰符strong时, 当...原创 2018-03-12 17:28:39 · 922 阅读 · 0 评论 -
使用atomic一定是线程安全的吗
使用atomic一定是线程安全的吗atomic所说的线程安全只是能保证了getter和setter存取方法的线程安全@property(atomic, strong) NSMutableArray *arr;原创 2018-03-05 15:36:01 · 2038 阅读 · 0 评论 -
自动释放池
autorelease本质上就是延迟调用release方法autorelease对象什么时候释放?引用计数为0的时候才会释放, 不是出了pool就释放在一些很消耗内存的循环调用的场景下有时需要手动干预autoreleased对象的释放时机, 不然会导致内存暴增, 最终导致程序崩溃NSThread和NSRunLoop是一一对应的关系在NSRunLoop对象的每个运行循环开始前,系统会自动创建一个au...原创 2018-03-13 15:02:32 · 815 阅读 · 0 评论 -
面试3
load和initialize共同点1.开发不主动调用情况下,系统最多调用1次2.父类和子类都被调用,父类调用一定在子类前load1.load方法不需要写明[super load] 父类就会收到调用, 并在子类之前initialize1.第一次主动使用当前类2.线程安全3.子类会把父类的实现继承过来调用一遍, 不需要调用superUIVIew和CALayer关系UIView是CALayer的del...原创 2018-03-19 17:32:33 · 264 阅读 · 0 评论 -
TCP为什么是三次握手
https://www.zhihu.com/question/24853633【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报...原创 2018-03-20 14:59:18 · 264 阅读 · 0 评论 -
iOS中实现单例
在类的内部提供一个static修饰的全局变量static SingletonVC * _singletonVC;;提供一个类方法方便外界访问+ (instancetype)share;;重写initWithZone方法,保证永远只为单例分配一次存储空间。...原创 2018-03-14 14:17:32 · 541 阅读 · 0 评论 -
Notification
可以看出,postNotification:总是会卡住当前线程,待observer执行(如不特殊处理selector也会在postNotification:所在线程执行)结束之后才会继续往下执行。所以是同步的。Notification Queues和异步通知创建一个NSNotificationQueue队列(first in-first out),将定义的NSNotificat原创 2017-04-27 15:45:42 · 262 阅读 · 0 评论 -
NSTimer循环引用的问题
前言:记得之前看过一个面试题问:ARC环境下的dealloc方法有什么用?问题解答是:代理指针置空,停止定时器timer,注销通知,释放掉实例变量。看着没什么问题,而且网上一收也是大概这样的答案。今天算是被实实在在的坑了一把,唉,其实说是被坑不如说是自己对定时器NSTimer没有一个足够的认识,我们总是习惯性的看着别人给好的答案而懒得去看API文档仔细分析。定时器NSTimer:最近做原创 2017-04-27 15:17:29 · 435 阅读 · 0 评论 -
多线程-锁
1 iOS开发中有8种锁 @synchronized性能最差- -!OSSpinLockdispatch_semaphorepthread_mutexNSLockNSConditionpthread_mutex(recursive)NSRecursiveLockNSConditionLock@synchronizedOSSpinLock自旋锁原创 2017-03-31 15:13:50 · 299 阅读 · 0 评论 -
多线程下载同一文件
http://www.cnblogs.com/wendingding/p/3947550.html1. 如何多线程下载文件比起单线程下载,多线程同一时间段发出多个下载请求,每个下载请求负责下载一段内容,充分利用了网络宽带a.获取文件的大小尺寸, 这关系到开启多少个下载线程,, 并不是越多越好,同时与cpu核数有关(这就导致有一些文档建议使用 CPU * 2 + 2 之类原创 2017-03-31 15:53:15 · 1618 阅读 · 0 评论 -
iOS数据库操作安全
总结:1 数据库频繁操作打开关闭,手动打开关闭锁, 使用一个单例类操作数据库2 避免同时操作一个资源使用队列串行方式首先数据库是系统资源,就像我们操作文件一样,所以并发操作时要注意安全在iOS上,只有一个线程能够打开数据库操作,其他线程要操作数据库必须等数据库关闭后才能打开操作。多线程时:每个线程独立打开数据库,操作数据库,操作完后关闭数据库。打开和关闭都比原创 2017-03-31 16:32:31 · 1163 阅读 · 0 评论 -
Runtime1
1. Objc Runtime其实是一个Runtime库, 它基于C和汇编编写的2. Runtime库主要做的事a 封装:c语言中的结构体, c函数被runtime函数封装后,我们就可以在程序运行时创建,检查,修改类,对象和它们的方法b 找出方法的最终执行代码 [object doSomething]3. Class类由class类型来表示, 它实际上是一个指向原创 2017-04-05 17:28:26 · 369 阅读 · 0 评论 -
Runtime2
1 类型编码编译器将每个方法的返回值和参数类型编码作为一个字符串2 关联对象我们不能在分类中添加成员变量解决方案:关联对象当宿主对象被释放时,会根据指定的内存管理策略来处理关联对象内存管理策略是retain关联对象,当宿主对象释放时,会自动release关联对象, 如果我们使用同一个key来关联另一个对象时,也会自动释放之前关联的对象3 SEL又叫选择器原创 2017-04-06 10:48:31 · 289 阅读 · 0 评论 -
深拷贝, 浅拷贝
http://blog.youkuaiyun.com/fg313071405/article/details/16858787[NSString copy] 指针复制,返回的对象的地址和方法的接收者一样,引用计数加1[NSMutableString copy] 深复制,重新Alloc一个 NSString 的对象,并返回。返回对象的地址和方法接原创 2017-04-06 11:11:27 · 267 阅读 · 0 评论 -
响应者链条
http://www.jianshu.com/p/77a1b6e5194d 事件的产生和传递 在iOS中凡是继承自UIResponder的对象都能够接收并处理事件。用户手指触摸屏幕一个view时候,系统会把该事件加入UIApplication管理的事件队列中去,这个队列是先进先出的,然后UIApplication会从事件队列中去除最前面的事件,并将事件分发下去以便处...原创 2017-04-06 11:23:39 · 340 阅读 · 0 评论 -
iOS程序main函数之前发生了什么
http://blog.youkuaiyun.com/guojin08/article/details/485277431.动态库链接库2.ImageLoader加载可执行文件, 里边是被编译过的符号,代码等3.runtime与+loadQ: 重载自己Class的load方法时需不需要调父类?A: runtime负责按继承顺序递归调用,所以我们不能调superQ:转载 2017-04-06 11:29:17 · 1101 阅读 · 0 评论 -
block背后的黑魔法
block背后的内存模型实际上是一个结构体,这个结构体会存储一个函数指针来指向block的实际执行代码。编译器为我们自动插入了_objc_retainBlock,而这个函数会把栈上的block拷贝到堆上Tips: 通常在写属性的时候,block都会声明为copy。这是显式的表示,即使block是栈上的,也会拷贝到堆上。其实在赋值的时候,编译器已经自动帮我们做了这些,所以原创 2017-04-21 10:05:51 · 307 阅读 · 0 评论 -
block与property
栈区(stack):存放函数的参数值、局部变量的值等,由编译器自动分配释放,通常在函数执行结束后就释放了,其操作方式类似数据结构中的栈。栈内存分配运算内置于处理器的指令集,效率很高,但是分配的内存容量有限,比如iOS中栈区的大小是2M。堆区(heap):就是通过new、malloc、realloc分配的内存块,它们的释放编译器不去管,由我们的应用程序去释放。如果应用程序没有释放掉,操作系统会自原创 2017-05-05 10:30:21 · 460 阅读 · 0 评论 -
深入理解Objective C的ARC机制
ARC背后的引用计数主要依赖于这三个方法:retain 增加引用计数release 降低引用计数,引用计数为0的时候,释放对象。autorelease 在当前的auto release pool结束后,降低引用计数。何谓自旋锁?它是为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在原创 2017-04-27 15:08:30 · 446 阅读 · 0 评论 -
weak实现原理, 及内存管理原理
内存管理原理两张表1.引用计数表 (引用计数值, 是否为弱引用)2.引用地址表当对象将要被销毁时, 判断是否为弱引用, 有弱引用遍历弱引用地址列表设置为nil执行销毁操作 Runtime维护了一个weak表,用于存储指向某个对象的所有weak指针。weak表其实是一个hash(哈希)表,Key是所指对象的地址,Value是weak指针的地址(这个地址的值是所指对象指针的地址...原创 2018-03-14 15:23:14 · 712 阅读 · 0 评论