每天一点iOS知识回顾1

1.简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwritereadonlyassignretaincopynonatomic atomicstrongweak属性的作用?

答: 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)、加锁(NSLockNSRecursiveNSConditionLock)、@synchronized,这个保护就是线程的同步。

用GCD中的串行队列来解释多线程的同步,也就是队列中的任务为串行,它们各自对相邻的任务有依赖性,如果任务1不完成,那么任务2就不会开始,这就是同步

你可能感兴趣的:(多线程,内存管理,package,gcd,线程和进程)