这篇只是用于记忆知识点
interface 接口
编程
基础知识类
在编程语言中,灵活与安全的问题总是冲突.过度的灵活会导致使用者经常使用到一些十分关键的位置,这使得它是开放的,易于修改的,同时这些关键,重要的的区域会处于危险的位置.
安全性的编程语言他们会制定许多协议,规范,告诉一些程序需要通过规范编写,这让程序犯错的几率变小,同时也让语言的灵活性大大降低.
.h 文件写方法的声明. 可以被子类调用(可以在对象范围之外调用) .m 文件 写方法的实现. 声明写在.m文件里,不可以在子类中调用.(不可以在对象范围之外调用)
.h 文件中的声明和属性可以被调用,可以被其他人看见,声明的实现写在.m 文件中
.m 文件实现.h文件的声明方法,.m文件也有声明,但是不可以被外部调用,只能在.m文件中作为全局变量使用. .m文件只有开发者可以看见,这里有封装的思想.
interface就是一个接口,在.h .m文件中,用于写声明
@implementation :实现
实例化:就是将一个抽象的类提供一个具体的例子.相当于属性赋值(不是初始化,初始化是init) [百科]在面向对象的编程中,通常把用类创建对象的过程称为实例化 线性表是最基础的数据结构.除了开节点,其他是线性排序.(基础单元:节点)
迭代器模式:顺序访问聚合对象(数据,字典,集合等); (无用)
Masonry : 目前最流行的autolayout第三方框架.
由于OC是基于C语言编写的,所以需要遵循C的一些特性
C语言 1.函数的声明: 在C语言中,函数的定义是有规范的:默认情况下,只有后面定义的函数才可以调用才可以调用前面定义的函数.
2.如果想把函数的定义写在main函数后面,而且main函数能正常调用这些函数,那么就必须在main函数前面声明.
3.函数的声明格式:你在main函数前面声明过一个函数,mian函数就知道这个函数的存在.而且只要知道函数名,函数的返回值.函数接受多少个参数,就能调用这个函数,因此,声明函数的时候可以省略参数的名称. 写函数声明不写函数定义 也会报错.(链接错误)
因此我认为OC是这样的
OC语言 1.方法的声明,OC中,方法的定义是有规范的,只有加载到viewdidload中方法才会调用.(在A文件中我们需要引入B头文件)
2.如果我们要调用B文件的方法,属性,协议(B头文件中有的),就必须先告诉编译器,这个方法是存在的.
3.我们需要在前面先初始化B,然后才能调用它.(强行凑3个)
语法糖 : 也称为糖衣语法,是指计算机语言中与另一套语言法等效开发者用起来却更为方便的语法.语法糖令程序更为易读,减少代码出错几率.
例子:
NSString *str = [animations objectAtIndex:1];
NSString *str = animations[1];
NSArray *XX = [NSArray arrayWithObjects:@"aa",@"bb",@"cc",nil];
NSArray *XX = @[@"aa",@"bb",@"cc"];
NSString *xx = [NSString stringWithString:@"xxx"]; //不可用
NSSting *xx = @"xxx";
当然简洁的方法需要建立在已经理解原意的基础上,否则会导致语法混乱,两种一样的语法冲突. ------编写高质量IOS与OSX代码的52个高效方法. (现在苹果系统叫Mac OS了)
便利构造器是一种快速创建对象的方式.它本质上是把初始化方法做了一次封装,方便外界使用,在init的时候同时给属性变量赋值的类方法.
类方法不能访问成员变量,但是可以通过对象方法调用.
http://blog.sina.com.cn/s/blog_877e9c3c0101gpnz.html
http://www.jianshu.com/p/215f7ad7b74c
工厂模式 http://my.oschina.net/leejan97/blog/311843
书写规范类
每个OC对象实例都是指向某块内存数据的指针.所以在声明变量时,类型后面加"*",而常量就不需要.
有状态的控件可以用set方法设置 = 需要你创建的对象与系统对象对应.这样才能显示.
cmd + shift + B 查看内存有无泄漏
interface :接口
引入一个文件调用 需要重定义;
数组是一块连续的存储空间(通过输出%p 来观察内存地址)
数组不可以进行整体赋值.
数组作为函数参数传递是地址传递会自动转换为指针类型,基本数据类型是值传递.
结构体: 是对数据的封装
函数 : 对功能的封装
封装的好处:
提高代码的可读性
提高数据的易用性
提高代码的可维护性
for循环中 三个参数使用分号;是因为它们是三个不同类型的参数
类和类的实例(对象)没有任何本质上的区别.任何类的定义都是对象.任何对象都是isa指针.
isa:是一个Class类型的指针.每个实例对象都有个isa的指针,而Class里也有isa的指针,指向meteClass(元类).
set:
- 作用:提供一个方法给外界设置成员变量值,可以在方法里面对参数进行相应过滤.
2.set方法后面跟上成员变量的名称,成员变量的首字母大写.
3.必须需要接受一个参数,而且参数类型根成员变量类型一致
4形参的名称不能跟成员变量名一样.
5.返回void
get:
1.作用:返回对象内部的成员变量
2.肯定有返回值
3.方法名与成员变量名一样.
4.不需要接受任何参数
我们在自定义协议时,由于是写在声明的上面,所以要添加一个类.不然Xcode找不到相关的类. .h文件同时又叫接口文件.
CocoaPods是开发OSX和IOS应用程序的一个第三方库的依赖管理工具.
字典转模型(runtime) 消息转发(多代理),
KVO 实现,方法交换
KVC:Key Value Coding :给模型属性赋值
KVO:Key Value ObsevRing :监听模型属性值的改变
观察者模式: 当一个物体发生变化时,会通知所有观察这个物体的观察者让其做出反应。实现起来无非就是把所有观察者的对象给这个物体,当这个物体的发生改变,就会调用遍历所有观察者的对象调用观察者的方法从而达到通知观察者的目的。
http://lastdays.cn/2016/02/22/base1/
//快速迭代 disatch_apply(线程名.count,queue,^size_t index){
}
http://weibo.com/bestswifter?is_hot=1#_loginLayer_1465972733804
解析: 将文件从你当前格式转为你需要的格式.
json本质是一个特殊格式的字符串.(不是NSString) jsonObejectWithData
Instancetype
- instancetype 在类型表示上,跟id一样,可以表示任何对象类型
- instancetype 只能用在返回值类型上,不能像id一样用来参数类型上.
- instancetype比id多一个好处,编译器会自动检测对象的类型.
GCD
进程:系统正在运行的一个程序
线程:程序运行开启的任务 (线程中任务执行是串行的,所以开多个线程)
每个程序都有一个主线程.称为"主线程"或"UI线程"
主线程主要作用:
显示/刷新Ui界面
处理UI时间
主线程关乎用户体验,选择主线程需要注意.(统筹思想)
多线程:多个线程
原理:CPU通过极快的切换来处理多个线程,达到伪多线程.
多个线程会降低程序的线程,CPU资源有限.
技术方案:GCD,NSThread.NSOperation,pthread (使用频率由高到低) //1创建线程后自动启动线程 //2隐式创建并启动线程
NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(run:) object:nil];
[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
//睡眠状态
[NSThread sleepForTimeInterval:3];
//选择具体休眠时间
NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:2];
//直接退出线程
[NSThread exit]
GCD 有俩个核心概念:
任务 : 执行什么操作
队列: 用来存放任务(以及何时执行,执行次数)
GCD执行操作常用函数
//异步操作
dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)
//同步操作(只能在当前线程做); dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)
同步(sync):只在当前线程中执行任务,不具备开启新线程的功能,串行执行任务
异步(async):可以在新的线程中执行任务,具备开启新线程的功能,并发执行任务
并发:多个任务同时进行.(异步线程用) 解锁多线程
串行:多个任务顺序执行;
//创建一个并发队列 //参数1:创建队列的名字 //参数2:执行同步还是异步操作
异步并发队列
//获取全局的并发队列
dispatch_queue_t queue = dispatch_queue_create("com.babb.queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)
//或者这样获取全局的并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
DISPATCH_QUEUE_CONCURRENT:并发队列
DISPATCH_QUEUE_SERIAL:串行队列
GCD默认已经提供了全局的并发队列,给整个工程使用,可以无需创建,直接调用. 使用 dispatch_get_global_queue(<#long identifier#>, <#unsigned long flags#>) 函数获得全局的并发队列.
同步函数 + 并发队列 = 不会开多个线程
异步串行
dispatch_queue_t queue = dispatch_queue_creat("com.xx.queue",DISPATCH_QUEUE_SERIAL); //将任务加入队列 dispatch_async(queue,^{ NSLog(@"写入任务"); });
//使用sync函数往当前串行队列添加任务,会卡住队列
获取主线程
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_async(queue^ { NSLog("放入主线程中不管是同步异步都是不开新线程的"); }); //同步函数放入主队列会导致逻辑冲突,发生错误.
dispatch_asnc(dispatch_get_global_queue(DISPATCH_QUEUE_DEFAULT,0),^{ NSLog(@"写其他任务"); //回到主线程 dispatch_async(dispatch_get_main_queue(),^{ self.XX.YY = YY;
});
});
//延迟执行队列
//方法一
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(),^{ NSLog(@"------"); });
//方法二
[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:NO];
//单次执行 通常用于单例 static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSLog(@"----"); });
多线程的常见问题 资源共享,
多个线程共同访问同一个资源,造成资源抢夺.需要加互斥锁. @synchronized (self) { } 主线程精髓,将耗时操作留给子线程,UI界面留给主线程 子线程加载完程序,回到主线程加载数据.
[self.image performSelectorOnMainThread:@selector(touchesForView:) withObject:_imageView waitUntilDone:YES];
[self.imageView performSelector:@selector(setImage:) onThread:[NSThread mainThread] withObject:_imageView waitUntilDone:NO];
单例
//单例 单例必须加static 固定属性; 它是类方法 .
单例模式:说白了就是一个类不通过alloc方式创建对象,而是用一个静态方法返回这个类的对象。系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为,比如想获得[UIApplication sharedApplication];任何地方调用都可以得到 UIApplication的对象,这个对象是全局唯一的。
写音频类软件时我们需要创建一个字典。用来保存当前存在的下载。使单例持有它,从而不会被销毁
缓存与下载的区别
- 缓存是当前程序内容保存,退出程序后释放.
- 下载是将文件保存本地,退出后仍然存在.
边下边播,给一个错误的网址,让程序走一个协议,这个协议可以请求你要下载的资源,实现边下边播的功能.
代理和通知的区别
代理:1个对象只能告诉另一个对象发生的事情
通知:一个对象可以告诉N个对象发生的事情.
//在Foundation框架中,使用NSJSIONSerialization对象来对data对象进行解析
//NSDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
//根据接口中的数据类型,将数据解析成OC中的数组对象或字典对象,如果接口最外层是字典就用字典接受,最外层是数组就用数组接受.
PHP
域名 . ip .公共部分 127.0.0.1
返回值参考
code msg 描述 1 成功 接口访问成功 2 失败 用户名错误 3 失败 密码错误
1.登录 拼接 /login.php? //参数 参数名 描述 是否为必填 userName 用户名 是 passWord 密码 是 参考链接: 127.0.0.1/login.php?userName=张三&passWord123456
返回值 { "code": 1, "msg": "成功", "result": { "userName": "abcdde", "age": 12, "phone": "110" } } -->
http及AFNetworking
http是客户端与服务器端通信的一套超文本协议,制定了标准,规范
URL决定和谁通信
URL的结构 https://(通信协议) www.baidu.com(hostname 主机名称)/baidu?wd=%E6%85%95%E8%AF%BE%E7%BD%91&tn= (/absolute-path路径[接口名称])monline_dg&ie=utf-8(?query查询条件[接口字段])
www.cocoachina.com/industry/20131106/7304.htmlgdsg
常用方法 标准用法
- GET : 从服务器获取一段内容,通常不包含请求体
- POST : 使用客户端提供的数据更新实体
不常用方法
HEAD :获取响应的元数据而无需检索响应的全部内容 PUI :使用客户端提供的数据添加实体 DELETE : 使用客户端提供的请求体来删除实体
NSURL 表示客户端访问哪台服务器端的指定资源 (粗浅的讲就是网址啦)
NSURLRequest :标识客户端发起的网络请求内容
NSURLConnection : 表示客户端与服务器端建立的网络连接接
NSURLResponse : 服务端给予客户端的请求结果.
//表示访问的服务器
NSURL *url = [NSURL URLWithString:@"http://www.imooc.com/"];
//表示客户端发起的网络请求的请求内容
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// NSURLConnection 此方法已经被NSURLSession代替了
NSURLConnection *connecction = [[NSURLConnection alloc]initWithRequest:request delegate:self];
//启动网络请求
[connecction start];
https://pic2.zhimg.com/3c73e679994145c986d2d935c691521d_b.jpg
数据相关
IOS的数据存储 http://www.jianshu.com/p/0cbc364d2ebc
架构
MVC : mode view controller
数据Model: 负责封装数据、存储和处理数据运算等工作
视图View: 负责数据展示、监听用户触摸等工作
控制器Controller: 负责业务逻辑、事件响应、数据加工等工作
mode类还持有俩个对象 item:是实际存储数据的对象,和view中的属性对应 Cache(缓存) MVVM
http://my.oschina.net/Jacedy/blog/603573
IOS真机测试
一:点击系统软件"钥匙串🔑",在菜单栏选择钥匙串访问--->证书助理--->从证书颁发机构请求机构请求证书--->跳出的窗口填写(随便谈) 请求是那里寻存储到磁盘(省事)-->继续 -->跳出的窗口文件最好放在桌面---------文件.
二:百度 Apple Developer (不是Apple)-->在菜单栏右边的Account登录开发者账号(普通苹果账号是无法申请证书的)-->左边菜单栏Certificates,IDs&Profiles--左边出现一侧菜单栏-->Certificates-->Development-->点击右侧+号添加 🔍搜索已添加证书 --> 按需选择IOS APP Development(测试证书)APPle push Notification serviceSSL (测试推送证书) -->APP Store and HOC 发布证书 APPlePushNotificationservice SSL (发布推送的证书) --> 点击下方的Worldwide DeveloperRelations Certificate Authorty (下载文件) ---> 点击Continue按钮 -->进入的页面需要选择文件->
三:找到刚刚下载好的文件双击打开 -->进入钥匙串页面-->点击钥匙串访问->证书助理->从证书机构请求证书->填写邮箱->存储到磁盘->继续->桌面-存储-完成->回到浏览器页面-->导入刚刚的文件-->continue-->点击download按钮下载->Done
四:打开Xcode,cod + 逗号 ,左边点击加号按钮 填写.