前段时间在面试,现在把面试中没有回答好的的问题记录一下
1、强引用和弱引用的引用计数会+1么
强引用引用计数会+1,弱引用表示非持有关系,引用计数不会+1
2、assign为什么不能用于修饰OC对象
对象的内存一般被分配到堆上,基本数据类型和OC的数据类型的内存是分配在栈上。如果用assign修饰对象,当对象被释放后,指针的地址还是存在的。堆上的内存由程序员释放,这个指针没有被置为nil,如果后面分配内存的时候,刚好分配这块内存,就会崩溃。
3、NSNotification在哪个线程接收的
NSNotification在哪个线程post,就在哪个线程中被转发,不一定是在注册观察者的那个线程。
4、怎么处理内存警告
APP收到内存警告,需要尽可能释放更多内存。移除缓存和图片对象,和懒加载的变量。
UIKit中有3个地方可以处理
AppDelegate的applicationDidReceiveMemoryWarning方法
VC的didReceiveMemoryWarning方法
注册并且接收UIApplicationDidReceiveMemoryWarningNotification的通知。
5、1000张图片怎么优化
用自动释放池及时回收图片的内存
for (NSInteger i = 0 ; i < 100 ; i ++ )
{
@autoreleasepool {
NSString * filePath = [[NSBundle mainBundle] pathForResource:@"image" ofType:@"PNG"];
UIImage * image = [UIImage imageWithContentsOfFile:filePath];
}
}
6、怎么解决死锁问题
产生死锁有四个必要条件
1 互斥条件:一个资源每次只能被一个进程使用
2请求与保持条件:一个进程因请求资源尔阻塞时,对已获得的资源保持不放
3不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺。
4循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
只要不满足其中之一的任意条件就可以避免死锁问题
7、tableView代理方法的调用顺序
详见tableView delegate方法执行顺序
8、怎么保证线程安全
1不耗时的操作尽量在同一线程。
2将访问资源设置为readonly。
3.用锁,比如GCD的信号量、互斥锁来达到阻塞线程的目的
9、View的动画属性有哪些
frame bounds center transform alpha backgroundColor
transform又包括位移、旋转和缩放
10、在找不到方法,调用doesNotRecognizeSelector之前,runtime做了什么
第一次机会:所属类动态方法解析
首先,如果沿继承树没有找到相关方法则会向接受者所属的类进行一次请求,能不能动态的添加一个类方法。
第二次机会:备援接受者
runtime会询问当前的接收者是否有其他的对象可以处理这个方法,这是个实例方法。
第三次机会:消息重定向
当没有备援接受者时,runtime会将未知消息的所有细节都封装为NSInvocation对象,然后调用- (void)forwardInvocation: (NSInvocation*)invocation;
假如这个方法一直没有处理,就调用父类的相关方法,一直到NSObject就会调用doesNotRecognizeSelector抛出异常。
网友评论