1.简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak属性的作用?
答: OC使用了一种叫做引用计数的机制来管理对象,如果对一个对象使用了alloc、[Mutable]copy,retain,那么你必须使用相应的realease或者autorelease。也可以理解为自己生成的对象,自己持有。非自己生成的对象,自己也能持有。不在需要自己持有的对象时释放。非自己持有的对象无法释放。生成并持有对象<alloc,new,copy,mutableCopy等>,持有对象<retain>,释放对象<release>,废弃对象<dealloc>。
retain对应的是release,内存的释放用release。
alloc对应的是dealloc,内存的销毁用dealloc。
readwrite此标记说明属性会被当成读写的,这也是默认属性。
readonly此标记说明属性只可以读,也就是不能设置,可以获取。
assign不会使引用计数加1,也就是直接赋值。
retain会使引用计数加1。
copy建立一个索引计数为1的对象,在赋值时使用传入值的一份拷贝。
nonatomic:非原子性访问,多线程并发访问会提高性能。
atomic:原子性访问。
strong:打开ARC时才会使用,相当于retain。
weak:打开ARC时才会使用,相当于assign,可以把对应的指针变量置为nil(防止野指针)。
2.类变量的@protected,@private,@public,@package,声明各有什么含义?
答:上面的几个声明表明的时类成员的作用域,
@private作用范围只能在自身类(外界既不可访问,又不能继承);
@protected作用范围在自身类和子类,如果什么都不加修饰,默认是@protected(外界不可访问,但是可以继承);
@public作用范围最大,可以在任何地方被访问(外界即可访问,又可以继承);
@package作用范围在某个框架内
3.线程是什么?进程是什么?二者有什么区别和联系?
答:线程是CPU独立运行和独立调度的基本单位(可以理解为一个进程中执行的代码片段),
进程是资源分配的基本单位(进程是一块包含了某些资源的内存区域)。
区别:进程是线程的容器,真正完成代码执行的是线程,而进程则作为线程的执行环境。一个程序至少包含一个进程,一个进程至少包含一个线程,一个进程中的多个线程共享当前进程所拥有的资源。
4.谈谈你对多线程开发的理解?ios中有几种实现多线程的方法?
答:在一个进程中有多个线程,每个线程有自己单独的任务
优点:效率快,防止界面卡死 缺点:不安全,耗费资源,增加代码复杂度
//实现多线程的方法1:用nsobject自带的
//[selfperformSelectorInBackground:@selector(singleLoadimage) withObject:Nil];
//实现多线程的方法2:NSThread类(线程类) 每一个线程类的对象都代表一个线程有点:可以看见所有线程的状态,所有线程都由开发者控制,轻量级,小号的资源相对少,缺点:1.对线程的控制过于详细,再实际开发中过于繁琐2.对与线程同步等安全问题也需要开发者手动管理代码
方式一:
//NSThread * thread = [[NSThread alloc]initWithTarget:self selector:@selector(singleLoadimage) object:Nil];
//thread.name = @"加载图片" ;
//[thread start];
方式二:[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:selfwithObject:nil];
NSThread *myThread = [[NSThread alloc] initWithTarget:selfselector:@selector(doSomething:) object:nil];
[myThread start];
////多线程3:NSoperation (线程队列)控制并发数
////如果使用 必须建立他的子类
////子类1
//NSInvocationOperation * option =[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(singleLoadimage)object:Nil];
////[option start];//单独建立它在主线程
//多线程4:GCD
//主队列:串行队列1个
//dispatch_queue_t main =dispatch_get_main_queue();
//第一个参数:在哪个队列执行方法 第二个参数:9执行什么方法
//dispatch_async(main, ^{
//for (int i = 0; i<100; i++) {
//NSLog(@"_____%d",i);
//}
//});
//dispatch_async(main, ^{
//for (int i = 100; i>0; i--) {
//NSLog(@"_____%d",i);
//}
//});
5.线程同步和异步的区别?IOS中如何实现多线程的同步?
区别:
1、同步就是说多个任务之间是有先后关系的,一个任务需要等待另一个任务执行完毕才能继续执行。 2、异步就是说多个任务之间没有先后关系,不需要相互等待各做各的事。
同步的话指的是多线程同时操作一个数据 这个时候需要对数据添加保护:原子操作(atomic)、加锁(NSLock、NSRecursive、NSConditionLock)、@synchronized,这个保护就是线程的同步。
用GCD中的串行队列来解释多线程的同步,也就是队列中的任务为串行,它们各自对相邻的任务有依赖性,如果任务1不完成,那么任务2就不会开始,这就是同步