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++程序中的多继承性。
两个清除缓存都是放在子线程中进行的。
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++程序中的多继承性。
相关文章推荐
- iOS 导航栏 知识总结
- ios 程序开发零散重点知识总结(一)暴走漫画制作笔记四
- iOS开发中的SQLite知识总结
- iOS 拨打电话相关知识总结
- iOS 与 JS 交互开发知识总结
- UIView的一般操作 - iOS - UI基础知识总结1
- cs193p斯坦福视频学习总结——iOS基础知识
- UITextField - iOS - UI基础知识总结4
- iOS网络相关知识总结
- iOS知识总结(使用gitbook)
- 关于Ios的知识总结
- iOS开发知识总结
- 单例模式:单例类的标准写法 - iOS - UI基础知识总结13
- iOS月薪10k以上知识大总结
- iOS网络HTTP、TCP、UDP、Socket 知识总结
- iOS网络HTTP、TCP、UDP、Socket 知识总结
- IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别
- ios 方面总结的相关知识(1)
- 学ios需要了解的C语言基础知识-11-C语言精华总结
- iOS开发之最近小知识总结二