您的位置:首页 > 移动开发 > IOS开发

ios中的知识总结

2017-08-24 11:01 113 查看
清除缓存为两部分,一是清除sdwebimage的缓存,二是清除自定义文件缓存,

两个清除缓存都是放在子线程中进行的。

2.执行some_obj =nil的原因在于:

当object做了realease之后,这个object的引用计数会立即减1,但这个object并不一定就立即被free了,直到引用计数变成0的时候,它才可能被free掉(此时也不一定会被立即free,object会被放到一个autorelease的pool中,在适当的时机才真正被free掉)

如果对象已经被执行了realease,但没有被置为nil,这时对象的指针仍然指向该对象,如果在object被realease之后,object真正被free掉之前,我们执行了[som_obj method]是可以的,但如果在object真正被free掉之后再执行[some_obj some_method]就不好了。

在[some_obj release]之后紧接着执行some_obj = nil 可以使得[some_obj some_method]无效。

对nil执行方法是安全的,对指向已经free的对象但未置nil的指针,执行方法,执行方法是不安全的,该野指针指向一块内存区域,

简单的some_obj = nil只是将指针置空,而不会释放内存,会造成内存泄露。

3.清理缓存,

获取缓存文件的大小。可以用nsfilemanager api来看

4.block,是一段封装的代码块,并可以放在任意位置使用,还可以传递数据。可以截取自动变量的匿名函数。

5.block代码块中的

Weakself.label.text = text;

block能截取自动变量,并且不能在block块中进行修改,这里面的label是全局变量,若如果定义的是局部变量则不能修改了。

^(nsstring *text){};——>bvc.callBackBLock——>callBackBlock(NSString *text)

block代码块赋值给bvc.callbackblock,此时callbackblock的指针就指向这个代码块。

2.调用callbackblock(nsstring *text)

3.由于callbackblock的指针是指向A中的block代码块,因此执行代码块的代码,

Bcc.callbackblock = ^(nsstring *text){

Blog (@“text is %@”,text)

}

Bcc.callbackblock = ^(nsstring *text){

Blog (@“text is %@”,text)

}

会执行第二次赋值。block的回调只对代码2生效,因为callbackblock的指针最后指向了代码2的代码块,

2.进程:进程是程序在计算机上的一次执行活动,打开一个app,就开启了一个进程,可包含多个线程。

线程:独立立

1.线程和进程的区别主要在于它们是不同操作系统资源管理方式,一个进程崩溃后,在保护膜的影响下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径,线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉等同于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率差一些。

2.线程是cpu独立运行和独立调度的基本单位(可以理解为一个进程中执行的代码片段)

3.进程是资源分配的基本单位(进程是一块包含了某些资源的内存区域)

4.进程是线程的容器,真正完成代码执行的线程,而进程则作为线程的执行环境。

ios中的4套多线程(pthread,nsthread,gcd nsoperation nsoerasionqueue):

1.pthread,ios中很少用到,因为在swift1.2中无法执行这套方案,

2.NSThread:经过苹果封装后的,而且完全面向对象的。需要手动管理,常用[nsthread currentthread]获取当前线程,便可知道当前线程的各种属性。

3.nsthread *thread = [nsthread alloc]initwithtarget self selector:@selector();

[thread start ];

4 .gcd grand central dispatch  它是为苹果的并行运算提出的解决方案,所以会自动合理地利用更多的CPU内核(比如双核,四核),最重要的是它会自动管理线程生命周期(创建线程,调度任务,销毁任务)

5.GCD两个非常重要的概念(任务和队列)

1.任务。

任务:即操作,说白了就是一段代码,在GCD中的就是一个block,任务执行的两种方式:同步执行和异步执行,同步执行和异步执行的区别是,是否会创建新的线程。

同步和异步的主要区别在于会不会阻塞当前线程,直到block中的任务执行完毕。

同步(sync),它会阻塞当前线程并等待block中的任务执行完毕,然后当前线程才会继续往下运行。

异步(async)操作,当前线程会直接往下执行,它不会阻塞当前线程。

2.队列:用于存放任务。一共有两种队列:串行队列和并行队列。

串行队列中的任务会根据队列的定义的fifo的执行,一个接一个的先进先出的进行执行。(gcd会先进先出的一个接一个的取出来,执行完一个,再执行下一个)

3.并行队列

放到并行队列的任务,gcd也会fifo的取出来,但不同的是,它取出来一个就会放到别的线程,然后再取出来一个又放到另一个线程。由于取的动作很快,看起来所有的任务都是一起执行的。不过,gcd会根据系统资源控制并行的数量,所以如果很多,它并不会让所有任务同时执行。

6.arc下需要手动释放的是:

Nsnotification  nastier

7.创建单例:

Static id_instance 

dispatch_once{

}

单例的作用就是生成一个唯一的对象。这个gcd方法只会走一次,所以只会有一个_instance,

Static,静态开辟一块空间,不用我们管理,如果变量一直要在程序运行期间存在,就不需要realease,如果变量量有一定的生命周期,结束时释放一次,_instance = nil,不过不知道你为什么要释放,释放了还怎么通过单例来持续共享数据 .

Car *c = [car alloc]init];

[c release];

c.speed = 100;//报错

Return 0;

当创建完对象,对象就会被销毁,成为僵shi对象,对象就会报错(野指针错误),如果放在程序最后面的话,则p.age正常进行。

解决办法就是使用autorelease方法,其返回值就是对象本身,autorelease会将对象放在一个自动释放池中,当自动释放池被销毁时,会对泄子里面的所有对象做一次release操作。

注意:autorelease只是把对象扔到自动释放池里面,延迟了对象被销毁的时间,并不可以改变对象的计数器,改变计数器只有retain 和release两种方法,缺点:不能控制对象被销毁的时间,内存

(2)

1.给对象发送一条autorelease消息,会将对象放到一个自动释放池中 

2.当自动释放池被销毁时,会对池子里面的所有对象做一次release操作。

3.会返回对象本身。

4.调用完autorelease方法后,对象的计数器不变。

(3)1不用再关心对象释放的时间,有利于规避坏内存访问的出现

      2不用再关心什么时候调用release

. 使用注意

3.1 占用内存较大的对象不要随便使用autorelease

3.1 占用内存较小的对象使用autorelease,没有太大影响

4.autoreleasepool

autoreleasepool是以栈结构存储的,先进后出,只有栈顶的Pool才处于活动状态,才可以装对象.并且因为是栈结构,所以销毁,是先销毁栈顶的pool,最后是栈底.

oc与面向对象

对象是oc程序的核心,万事万物皆对象是程序中的核心思想。

类是用来创建同一类型的对象的模板,在一个类中定义了该类对象所具有成员变量以及方法。

nil:指向oc中对象的空指针

Nil:指向oc中类的空指针

NULL:指向其他类型的空指针,如一个c类型的内存指针

Nsnull:在集合对象中,表示空值的对象。

若obj为nil:

[obj message]将返回no,而不是nsexception;

若obj为nsnull:

[obj message];将抛出异常nsexception.

nil和NULL从字面意思来理解比较简单,ni
b8df
l是一个对象,而NULL是一个值,我的理解是nil是将对象置为空,而NULL是将基本类型设置为空,而且我们对于nil调用方法,不会产生crash或者抛出异常。

NSURL *url = nil;

Class class = Nil;

Int *pointerInt = NULL;

nil是一个对象指针为空,Nil是一个类指针为空,NULL是基本数据类型为空.

空指针;是指未指向一块有意义的内存区。如int *p;int *p = NULL;

//nil指向对象 

NSURL *url = nil;

//Nil指向类

Class class = Nil;

//NULL是基本数据类型设置为空

Int *pointerInt = NULL;

枚举值 它是一个整形 并且它不参与内存的占用和释放,枚举定义变量可直接使用,不用初始化,在代码中使用枚举的目的只有一个,那就是增加代码的可读性。

创建的枚举变量只能使用一个枚举值,因为网络连接只会同时出现一种情况,该枚举的所有枚举值都是互斥的。

Java :全称应该是java applet ,是嵌在网页中,而又有自己独立运行窗口的小程序,

Javascript:是一种脚本,javascript没有独立运行的窗口,浏览器当前窗口就是它的运行窗口。

一个javascript程序就是一个文档,一个文本文件。它是嵌入到HTML文档中的 。

(1)java比c++程序可靠性高。

(2)java语言不需要程序对内存进行分配和回收。

(3)java语言中没有指针的概念,引入了真正的数组。

(4)java用接口技术取代c++程序中的多继承性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: