1.原子性:nonatomic 、atomic
2.读写: readwrite 、readonly
3.方法名:getter=<name>、setter=<name>
4.内存:strong、retain、copy、weak、assign 、unsafe_unretainedgit
atomic:原子性,只有一个线程能够同时访问实例。atomic 是线程安全的,至少在当前的读取器是安全的。虽然它是一个默认属性,可是因为其使用同步锁开销较大,会损耗性能。
nonatomic:非原子性的,能够被多个线程访问。效率要比atomic 高,可是不能保证其在多线程状态下的安全性,在单线程和明确只有一个线程访问的状况下被普遍使用。程序员
readwrite(默认值):表示其同时拥有getter 和 setter 方法;
readonly:只读操做,其只有getter 方法,没有setter法
注:若是某个实例只容许被外部读取,而不能写入操做,同时在类实现文件当中能够写入的话,能够在头文件中声明属性为只读的,在实现文件中设置其为可读写的属性,写法以下:github
//头文件中声明为: @property(nonatomic,readonly,copy) NSString *stringA; //实现文件中声明为: @property(nonatomic,readwrite,copy) NSString *stringA;
getter=<name>的样式:
@property (nonatomic, getter=isOn) BOOL on;编程
assign:用于值类型(如int,float等)
weak: 用于修饰引用类型
unsafe_unretained:只修饰引用类型
区别:数组
strong:用于引用类型,强引用。
retain :用于引用类型,强引用。
copy:修饰属性会在内存里拷贝对象。
区别:浏览器
iOS应用沙盒即文件系统目录,与其余应用的文件系统隔离缓存
Documents:保存应用运行时生成的须要持久化的数据,如游戏进度、涂鸦软件的绘图等信息, 该目录会被iTunes同步备份。安全
Library/Caches:保存应用运行时生成的须要持久化的数据,iTunes同步设备时不会备份该目录。通常存储体积大、不须要备份的非重要数据,如缓存图片或者离线数据(地图等)。服务器
Library/Preference:保存应用的全部偏好设置,iOS的Settings(设置)应用会在该目录中查找应用的设置信息。iTunes同步设备时会备份该目录。多线程
tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录。从新手机、系统磁盘不足时都会被清理
栈区(stack):由系统自动分配和释放,存放局部变量的值,容量小速度快,有序
堆:通常由程序员分配和释放,若是不释放,则出现内存泄露。程序会回收您的内存,特色:容量大,速度慢,无序
静态存储区:全局变量(外部变量)和静态变量都存放在静态区域。当程序结束使,系统回收
常量区:存放常量的内存区域,程序结束时,系统回收
代码区:存放二进制代码的区域
简易推送流程:
第三方推送的原理(以个推为例):
Block为何要用copy
a、block在建立的时候默认分配的内存是在栈上,而不是在堆上。这样的话其自己的做用域是属于建立时候
的做用域,一旦在建立的做用域以外调用就会致使程序的崩溃。因此使用了copy将其拷贝到堆内存上。
b、block建立在栈上,而block的代码中可能会用到本地的一些变量,只有将其拷贝到堆上,才能用这些变量
Block为何不用retain
retain这是增长了一次计数,block的内存仍是在栈上,并无存在堆上,存在栈上的block可能随时被系统回收。
为何进入block中的对象引用计数须要自动加1
Block执行的是回调,所以block并不知道其中的对象obj建立后会在何时被释放,为了避免在block使用obj以前,对象已经被释放,block就retain了obj一次
block和函数的关系
Block的使用很像函数指针,不过与函数最大的不一样是Block能够访问函数之外、词法做用域之内的外部变量的值。
换句话说,Block不只 实现函数的功能,还能携带函数的执行环境。
对于block的理解
block其实是: 指向结构体的指针
编译器会将block的内部代码生成对应的函数
对于基本数据类型,进入到block中会被当作常量处理
NSTimer
NSTimer对象timer做为一个对象A的属性,本意在A的dealloc中释放timer,可是timer没有中止就不会触发dealloc,而后就互相等待,形成循环引用。解决方法是显式的调用timer的关闭方法[timer invaluate],再释放A对象
Block
block代码块没有配合weak使用
Delegate
声明delegate时请用assign(MRC)或者weak(ARC)。
循环引用举例:
NSMutableArray *firstArray = [NSMutableArray array]; NSMutableArray *secondArray = [NSMutableArray array]; [firstArray addObject:secondArray]; [secondArray addObject:firstArray];
检测循环引用
Xcode -> Product -> Pofile -> Leaks
用变量a给出下面的定义原文连接
a) 一个整型数
b) 一个指向整型数的指针
c) 一个指向指针的的指针,它指向的指针是指向一个整型数
d) 一个有10个整型数的数组
e) 一个有10个指针的数组,该指针是指向一个整型数的
f) 一个指向有10个整型数数组的指针
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数
h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer
1.概念理解:
多线程是针对于单核的CPU来设计的,目的是为了让CPU快速在多个线程之间进行调度。
多线程的优缺点
优势:提升程序的执行效率
缺点:开启线程须要必定的内存空间
同步和异步:决定了可不能够开启新的线程
同步:在当前线程中执行任务,不具有开启新线程的能力
异步:在新的线程中执行任务,具有开启新线程的能力
并行与串行:决定了任务的执行方式
并行:多个任务并发(同时)执行。类型迅雷,多个任务同时开启下载
串行:一个任务执行完毕后,再执行下一个任务。相似浏览器的一个接一个下载
iOS应用程序中都是一个主线程,也成为UI线程
那么主线程的做用就是用来更新UI,显示或者刷新界面
注意:不能将耗时的任务放在主线程上,不然会出现卡顿的现象。
2.iOS的三种多线程编程技术
NSThread
直接操做线程对象,但须要手动管理生命周期,并且常用这种方式来查看当前线程
GCD(Grand Central Dispatch)
底层使用的是C语言,灵活方便,能够根据系统负荷来增减线程,性能效率更好
Cocoa NSOperation
NSOperation对GCD的封装,使用起来更好理解,将任务封装为NSOpertaion,添加到NSOPerationQueue对象中
子类化NSOpertaion的设计,更具备面向对象(封装,复用)的特性。更加适合在复杂项目中使用
3.进程与线程
Progress和Thread,进程和线程是操做系统里的基本概念
线程与进程的区别:
线程是资源分配的最小单位,也是处理器调度的基本单位,可是进程不是
进程是资源拥有的单位,同一个进程内的线程共享进程里的资源
多进程,容许多个任务同时运行
多线程,容许单个任务分为不一样的部分运行
音频的播放从形式上分为音频播放和音乐播放。
音频播放:一般时间较短,不须要进度控制,和循环控制。使用AudioToolbox.framework。
音乐播放:一般时间较长,须要进行精准控制。使用AVFoundation.framework。
音频播放
AudioToolbox.framework是基于C语言的框架。
原理:将短音频注册的到系统声音服务(System Sound Service)中。System Sound Service是一种简单、底层的声音播放服务。
1.音频播放时间不能超过30秒。
2.数据必须是PCM或者IMA4格式。
3.音频格式必须打包成.caf、.aif、wav中的一种。(这是官方说法,实际发现一些.mp3也能够)。
音乐播放
1.适合播放较大的音频。
2.能够对音频进行精准的播放控制
3.使用AVFoundataion.framework中的AVAudioPlayer来实现。
使用:
1.初始化AVAudioPlayer对象,一般是指定本地文件路径
2.设置播放器属性,例如重复次数,音量大小等。
3.调用play方法播放。
注意:AVAudioPlayer一次只能播放一个音频文件,全部的上一曲和下一曲都是经过建立多个AVAudioPlayer来实现的。
Apple已经为咱们提供了多种方法来实现视频播放,包括MPMoviePlayerController,MPMoviePlayerViewController,AVPlayer,AVPlayerViewController等。而值得注意的是,上述的MPMoviePlayerController与MPMoviePlayerViewController在iOS9.0以后被弃用。下面是四种播放方式的区别:
Class class = NSClassFromString(@“Student”); Student *student = [[class alloc] init];
Class class = [student class]; NSString *calssName = NSStringFromClass(class);
SEL selector = =NSSelectorFromClass(@“setName”); [stu performSelector:selector withObject:nil];
NSStringFromSelector(@selector *( “setName:”));
开辟内存空间
初始化参数
返回内存地址值
一、 初始化方法事不会调用
二、滚动UIScrollview触发
三、旋转屏幕时触发
四、改变View的值时候触发,前提是frame改变了
五、改变UIView的大小时触发
NSOperationQueue是存放NSOPeration的集合类,能够参考JAVA中的线程和线程池的概念。
虽然说是queue,但并非队列的意思,并不遵照先进先出。
因此咱们能够理解为Pool ,即线程池。
OC将数据、对象类型的肯定从编译阶段推迟到了运行时。实现这一操做的基础是面向对象语言的多态特性。
这里面有有两个关键字:运行时和多态
运行时:运行时机制使咱们知道运行的时候才肯定一个对象的类型、以及调用该类别对象指定的方法。
多态:不一样的对象以本身的方式来响应相同的消息。子类的指针能够赋值给父类。
“queue中所执行的代码不必定在main thread中。若是queue是在主线程中建立的,那么所执行的代码就是在主线程中执行。若是是在子线程中建立的,那么就不会在main thread中执行。“
上述说法并不彻底正确,queue中所执行的代码不必定在主线程是对的,可是队列Queue中执行的任务是在否在主线程与建立队列所在的线程并没有关系。
对于这个问题,首先总结几个知识点:
1.iOS中获取队列的三种方式:
主线程队列:
主线程队列为串行队列,和主线程绑定。同普通串行队列同样,队列中任务一次只能执行一个,可是队列中全部任务都在主线程中执行(通过测试,即便是异步添加的任务,也没有建立新的线程)。
全局队列:
系统全局队列为并发队列,根据不一样的优先级(HIGH、DEFAULT、LOW、BACKGROUND)有四个。
自定义队列:
系统提供方法,能够自定义建立串行和并行队列。
2.同步与异步,串行与并行
同步与异步:决定可不能够开启新的线程
同步:在当前线程当即执行添加的任务,不具有开启新线程的能力。
异步:在新的线程中执行任务,具有开启新线程的能力
并行与串行:决定了任务的执行方式
并行:能够多个任务并发(同时)执行。类型迅雷,多个任务同时开启下载
串行:一个任务执行完毕后,再执行下一个任务。相似浏览器的一个接一个下载
总结:队列Queue中执行的任务是在否在主线程与建立队列所在的线程无关。
判断一个任务是否是在主线程,咱们能够首先判断同步仍是异步,由于异步才具备开启新线程的能力。然而咱们还须要注意两点:
1.主线程所在队列为串行队列,添加同步会致使死锁。
2.并不是全部的异步任务都不在主线程中,主线程队列中添加异步任务,并不开启新的线程。
302是请求重定向。
500及以上是服务器错误,如503表示服务器找不到、3840表示服务器返回无效JSON。
400及以上是请求连接错误或者找不到服务器,如常见的404。
200及以上是正确,如常见的是200表示请求正常。
更多参考: Http状态码详细说明
对于细碎知识点的学习,通过了不断的测试和理解,咱们才会发现还有太多值得研究的地方。若是有不对的地方我会尽快更正。