分类的实现原理,编译时的表现,运行时的加载原理
参考文档: objc4-723
category的主要作用是为已经存在的类添加方法。可以把类的实现分开在几个不同的文件里面。
Category 结构体
Category用Category_t结构体定义:
1 | typedef struct category_t { |
分类的实现原理,编译时的表现,运行时的加载原理
参考文档: objc4-723
category的主要作用是为已经存在的类添加方法。可以把类的实现分开在几个不同的文件里面。
Category用Category_t结构体定义:
1 | typedef struct category_t { |
介绍 对象关联,以及如何为Category添加weak属性
apple open source
创建一个类的分类Category,并添加一个属性CategoryProperty,分类中的@CategoryProperty并没有帮我们生成实例变量以及存取方法,要求我们手动实现,这时候就需要用到对象关联。
在分类中,因为类的实例变量的布局已经固定,使用 @property 已经无法向固定的布局中添加新的实例变量(这样做可能会覆盖子类的实例变量),所以我们需要使用关联对象以及两个方法来模拟构成属性的三个要素。
关联对象又是如何实现并且管理的呢:
本文主要讲使用IP代理防止爬虫被禁
在 python爬虫中爬取到大约184条数据后,zhipin网站就会采取链接重定向方式 阻止爬取。如果在代码中取消登录操作 , 直接爬取到大约92条数据,你的 IP 就会被封啦~

为了防止这个悲剧发生 根据Scarpy https://doc.scrapy.org/en/latest/topics/practices.html?highlight=banned#avoiding-getting-banned 有以下几个建议:
scrapy基础实例,爬取zhipin网站信息
scarpy的新建 + scarpy模拟登录 + 在pipeline中存取信息到sqlite3 +xpath解析页面
1 | scrapy startproject projectName |
具体可以查看 python3爬虫学习
发现 parse 或者 start_requests是爬虫的入口
python3 爬虫
网络连接
1 | from urllib.request import urlopen |
BeautifulSoup
中文文档 https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/
Serialization 包括
AFURLResponseSerialization和AFURLRequestSerialization
AFURLResponseSerialization 是处理响应的模块,将请求返回的数据解析成对应的格式。而AFURLRequestSerialization的主要作用是修改请求(主要是 HTTP 请求)的头部,提供了一些语义明确的接口设置 HTTP 头部字段。
AFURLResponseSerialization 是一个协议,协议的内容为:
1 | - (nullable id)responseObjectForResponse:(nullable NSURLResponse *)response |
它的实现类为:
在文件中 所有类都遵循AFURLResponseSerialization,而AFHTTPResponseSerializer是其他类的基类。
AFURLSessionManager 和 AFHTTPSessionManager 是AFNetworking的核心类
这里先阅读AFURLSessionManager。
1 | NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; |
AFNetworking3源码阅读-Security
自 iOS9 发布之后,由于新特性 App Transport Security 的引入,在默认行为下是不能发送 HTTP 请求的。很多网站都在转用 HTTPS,而 AFNetworking 中的 AFSecurityPolicy 就是为了阻止中间人攻击,以及其它漏洞的工具。
AFSecurityPolicy 主要作用就是验证 HTTPS 请求的证书是否有效,如果 app 中有一些敏感信息或者涉及交易信息,一定要使用 HTTPS 来保证交易或者用户信息的安全。
HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密
可 以理解为证书绑定,是指客户端直接保存服务端的证书,建立https连接时直接对比服务端返回的和客户端保存的两个证书是否一样,一样就表明证书 是真的,不再去系统的信任证书机构里寻找验证。这适用于非浏览器应用,因为浏览器跟很多未知服务端打交道,无法把每个服务端的证书都保存到本地,但CS架构的像手机APP事先已经知道要进行通信的服务端,可以直接在客户端保存这个服务端的证书用于校验。
为什么直接对比就能保证证书没问题? 如果中间人从客户端取出证书,再伪装成服务端跟其他客户端通信,它发送给客户端的这个证书不就能通过验证吗?确实可以通过验证,但后续的流程走不下去,因为下一步客户端会用证书里的公钥加密,中间人没有这个证书的私钥就解不出内容,也就截获不到数据,这个证书的私钥只有真正的服务端有,中间人伪造证书主要伪造的是公钥。
为什么要用SSL Pinning?正常的验证方式不够吗?如果服务端的证书是从受信任的的CA机构颁发的,验证是没问题的,但CA机构颁发证书比较昂贵,小企业或个人用 户 可能会选择自己颁发证书,这样就无法通过系统受信任的CA机构列表验证这个证书的真伪了,所以需要SSL Pinning这样的方式去验证。
AFNetworking3源码阅读-Reachability
用于监控网络状态。当网络状态改变时,是重新发起一些请求的好时间;网络状态的监控也能给用户更好的网络失败提示。
1 | [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { |