编码规范
- 用 Tabs,而非 空格
- 文件结束时留一空行
- 用足够的空行把代码分割成合理的块
- 不要在一行结尾留下空白
- 千万别在空行留下缩进
- 对于只读属性的 properties 和 subscripts,选用隐式的 getters 方法
- 如果可以,省略只读属性的 properties 和 subscripts 的 get 关键字
举栗子说明
对于顶级定义,永远明确的列出权限控制
顶级函数,类型和变量,永远应该有着详尽的权限控制说明符
当指定一个类型时,把 冒号和标识符 连在一起
当指定标示符的类型时,冒号要紧跟着标示符,然后空一格再写类型
需要时才写上 self
当调用self的 properties 或 methods 时,self用默认的隐式引用:
相对于 classes 先选 structs
除非需要 class 才能提供的功能(比如identity或 deinitializers),不然就用 struct
要注意到继承通常不是用 类 的好理由 多态 可以通过 ==协议 ==实现 重用 可以通过 ==组合 ==实现。
默认 classes 为 final
Classes应该作为基类,只能被子类已识别正当的继承。即使这种例子,根据同样的规则,类中的定义也要尽可能的用 final 标注上
理由: 组合通常比继承更合适,而且不用 继承意味着考虑的更多
能不写类型参数的就别写了
参数化类型的方法可以省略接收者的类型参数,当他们对接收者来说一样时。比如:
理由: 省略多余的类型参数让意图更清晰,并且通过对比,让返回值为不同的类型参数的情况也清楚了很多。
时间 日期
- 如何定义时间变量?(当前时间 昨天 明天)
- 如何按指定格式显示时间?(2016-10-1 10/1/2016 AM PM )
- 如何处理不同时区的时间?(北京 纽约 伦敦 东京)
- 如何显示当前日期?(公历 or 农历)
字符串处理
- 转为大(小)写 uppercased lowercased
- 去掉左右空格 trimmingCharacters(in: .whitespaces)
- 判读是否以某些字符串开始(或结束) hasPrefix hasSufix
- 获取字符数 characters.count
- 分解字符串 components(separatedBy: " ")
- 查找字符串 rangeOfString
- 取子字符串 substring
- 从文件初始化 String(contentsOfFile: )
- 保存到文件 write(toFile: )
文件操作(沙盒)
- 如何防止安装恶意APP?
- 如何防止恶意APP修改破坏操作系统的文件?
- 如何防止恶意APP随意访问你的私人信息?
- 如何防止恶意APP访问或修改其他APP的文件?
- 代码签名 + 用户权限 (mobile) + 沙盒
攻击点少:
不支持Flash和Java
减弱部分文件的扩展功能(比如:psd、pdf等)
沙盒机制:
iOS防御机制的最后一环是沙盒
沙盒可以对进程可执行的行动提供更细粒度的控制
应用程序只能访问自己的数据和用户许可的部分系统数据,不能直接访问其他应用的数据
代码签名:
所有的二进制文件(binary)和类库在被内核允许执行之前都必须经过受信任机构(比如苹果公司)的签名
内存中只有那些来自已签名来源的页才会被执行
这样做都是为了防止用户从因特网上下载和执行随机的文件
签名可以保证所有的应用都必须从苹果的App Store下载
文件操作( sandbox 沙盒)
每个iOS应用都被限制在“沙盒”中
沙盒相当于一个加了仅主人可见权限的文件夹
在应用程序安装过程中,系统为每个单独的应用程序生成它的主目录和一些关键的子目录
苹果对沙盒有几条限制:
- 应用程序在自己的沙盒中运作,但是不能访问任何其他应用程序的沙盒;
- 应用之间不能共享数据,沙盒里的文件不能被复制到其他应用程序的文件夹中,也不能把其他应用文件夹复制到沙盒中;
- 苹果禁止任何读写沙盒以外的文件,禁止应用程序将内容写到沙盒以外的文件夹中;
沙盒也有例外,比如系统通讯录能在用户授权的情况下被第三方应用访问)
sandbox对应用程序执行各种操作的权限限制
这个规则把iOS系统的封闭性(安全性)展现的淋漓尽致
目录结构
每个应用的沙盒目录都是相似的,主要包含3个目录和应用程序:
每个应用的沙盒目录都是相似的,主要包含3个目录和应用程序: Documents:存储应用程序的数据文件,存储用户数据或其他定期备份的信息; Library:有两个文件夹,Caches存储应用程序再次启动所需的信息, Preferences:包含应用程序的偏好设置文件,不可在这更改偏好设置;temp存放临时文件即应用程序再次启动不需要的文件。
1、MyApp.app
存放内容
该目录包含了应用程序本身的数据,包括资源文件和可执行文件等。程序启动以后,会根据需要从该目录中动态加载代码或资源到内存,这里用到了lazy loading的思想
整个目录是只读的
为了防止被篡改,应用在安装的时候会将该目录签名。
非越狱情况下,该目录中内容是无法更改的
在越狱设备上如果更改了目录内容,对应的签名就会被改变,这种情况下苹果官网描述的后果是应用程序将无法启动
2、Documents
存放内容
将应用程序的数据文件保存在该目录下。
这些数据类型仅限于不可再生的数据,可再生的数据文件应该存放在Library/Cache目录下。
3、Documents/Inbox
存放内容
该目录用来保存由外部应用请求当前应用程序打开的文件。
比如我们的应用叫A,向系统注册了几种可打开的文件格式,B应用有一个A支持的格式的文件F,并且申请调用A打开F。由于F当前是在B应用的沙盒中,我们知道,沙盒机制是不允许A访问B沙盒中的文件,因此苹果的解决方案是讲F拷贝一份到A应用的Documents/Inbox目录下,再让A打开F。
4、Library
存放内容
苹果建议用来存放默认设置或其它状态信息。
存放内容
主要是缓存文件,用户使用过程中缓存都可以保存在这个目录中
Documents目录用于保存不可再生的文件,而这个目录用于保存那些可再生的文件,比如网络请求的数据
鉴于此,应用程序通常还需要负责删除这些文件。
存放内容
应用程序的偏好设置文件
使用NSUserDefaults写的设置数据都会保存到该目录下的一个plist文件中,即所谓的写入plist
存放内容
各种临时文件,保存应用再次启动时不需要的文件。
当应用不再需要这些文件时应该主动将其删除,因为该目录下的东西随时有可能被系统清理掉,目前已知的一种可能清理的原因是系统磁盘存储空间不足的时候。
1)存放内容
该目录用来保存由外部应用请求当前应用程序打开的文件。
比如我们的应用叫A,向系统注册了几种可打开的文件格式,B应用有一个A支持的格式的文件F,并且申请调用A打开F。由于F当前是在B应用的沙盒中,而沙盒机制是不允许A访问B沙盒中的文件,因此苹果的解决方案是将F拷贝一份到A应用的Documents/Inbox目录下,再让A打开F。
2)是否会被iTunes同步
|
请发表评论