UI
http的三次通话 token https/http的区别
字符串(增删改查)
数组
字典
集合
通知
数据解析 NSData
枚举/循环/嵌套
多线程 (回调,break,sleep)
指针/堆栈
引用
属性
封装/继承/多态 (扩展)
内存GCD
runtime/runloop
KVO
规范
工厂模式/协议/
各种热门应用SDK 地图,支付,语音(权限请求)/媒体(AVFoundation)
编程概念
类型:通过声明类型和名称,可以为程序创建新的变量. 有了类型编译器才会知道申请多少字节(内存)
类比:就和物理中的各单位一样,有了类型我们才好知道它是速度?时间/长短,不匹配的类型会导致无法计算/计算错误.
变量:与某块数据相关联的名称
变量需要类型,同时也需要名称,变量名遵循驼峰命名法原则.字母/数字/下划线开头.变量名尽量与数据有关,使用统一规范,易于管理.
简写:为了减少程序员的编码量,提高效率,有很多常用代码OBJC语言提供
选择:程序会根据用户的不同选择显示不同的结果,或是界面/计算数值/计算方法.以下有几种常见选择的使用.if和else,bool,枚举
if(条件表达式){
//如果条件表达式符合,执行此段代码
}else{
//否则执行此段代码
}
while循环
while (检查表达式) {
输出代码
自变量
}
for 循环
for (初始化;检查表达式;自变量){
输出代码.
}
do-while 循环
do{
输出代码
自变量
}while(检查表达式)
break :用于中断循环.
continue:用于恢复循环(未达到某个条件,跳出此循环继续下一个循环,方便去除特定数值)
函数:与某块代码相关联的名称(就是相当于一个小组名,告诉人它的用处)
函数需要前缀,告诉人们它返回什么类型数值,或是字符串或是数组,也可以为空(void),有了前缀后还要有函数的名字,让编程者快速了解此代码的作用好尽快使用/组合.
函数一般需要写入参数,我们需要给提示该写入什么类型参数,这个提示也需要名称的,同时需要遵循格式以逗号和其他形参隔开,这就是就是形参(parameter).当我们按照类型传入数值时,这个值就是实参(argument).
函数还可以协同作用.在函数内编码时可引用实现文件下的函数和该Foundation下的函数.自己阴用自己叫递归,需要限制条件(不然会无限递归)
标注库(standard libraries):其实在我们编程前,系统已经帮我们预编译了许多函数,这些代码有很多共通性可与让程序员专心编写业务代码.
局部变量:就如同函数如果不在.h文件声明它就不能被其他文件引用一样,在函数中声明的变量叫局部变量(local variable),它只有在函数执行的时候才会被使用.在该文件下所有函数都可以引用的变量叫全局变量(global variable),全局变量加个属性static,就是静态变量,静态变量只有声明的文件才能访问,其他的引用文件不可访问(也就是说全局变量所在的文件被引用了,那么久可以访问),变量放在专门的位置.局部变量放在帧(frame)中,它是编译器在函数执行时记录数据的地方,运行完函数就销毁.这和程序的生命周期有关(高效省内存).程序是多线程操作,这边完成一部分那边完成一部分.函数执行时帧被创建出来放到栈(stack)中,执行完毕退出栈.等待下一次调用.大家使用栈在描述帧在内存中存储的地点.栈有个特性是”先进后出,后进先出”类比相当于做电梯.有助于理解函数的运行.
作用域:函数定义中,一对花括号定义了函数的作用域.变量只在声明它的作用域中有效.通俗的讲就是有作用的地方.不同的对象在不同的位置有 不同的作用范围.在.m文件中全局变量的作用范围就是该.m文件下所有函数都可以借用.放在所有文件下都有作用的叫宏定义
编程肯定会有错误/优化的时候,这时候就需要我们做好准备,一个是单元测试,写好一个功能运行测试一下.确保产生错误就发现错误,另一个是写好注释.以便程序员好快速上手.另外需要按照统一的格式编写代码一个标准高效编写.最后学会调试,打断点(breakpoint)看数据.打好断点就可以使用各种调试工具定位错误.
数字:不同的数字占用的内存大小不同,针对不同量级的数字使用不同的标准.(正数尺寸有8,16,32,64位bit)同时数字有正负,正整数是无符号数(unsigned number)输出格式是%u,负整数是有符号正数(带小数的叫浮点数,同理) .计算机根据ASCII码表将字符转化为数字,这叫编码.特殊字符有其他的编码格式.有符号数和无符号数在二进制上正好相反.相当于010101和101010.
数字运算,整数与整数相除得到还是整数,若数不是整数那么就用float计算.Xcode最近准备禁用32位的应用,只使用64位的应用.之前为了代码可以在其他系统运行,苹果引进NSInterger和NSUInteger(U是unsigned的意思,无符号)可以替代C的long与unsigned long.
运算符也有简写,a = a+5 可以替换为 a += 5. 同时在条件运算符中常用的数+1,x + 1 替换为 x++. x - 1 替换为 x—. 更复杂的数学运算需要数学代码库,在C中需要引入#incloud <math.h>在mac 中需要打开终端输入 man math .
地址与指针:我们需要内存来帮我们操作数据,CPU通过随机存储器RAM来运算和处理.内存是用来交换数据.内存是有数字编号的,通常用地址(address)来指代某个特定字节的数据.就是我们常说的内存地址.内存太小运算不足,内存太大cpu寻址时间加长.每一个内存地址都是绝对的,不可修改的,但是内存地址是给计算机看的,对人十分不友好.所以要给内存地址抽象化,标签化.这就有了指针.指针可以修改,重定向.
我们使用*星号来指代指针,抽象概念的指针可以指向另一个指针,它只是一个标签.用更简便的标签替换复杂的标签.同时注意指针指向的内存地址,一旦这个内存地址被抛弃,再次指向的就是其他地址了,这就造成数据错误,形成野指针.
内存计数:Objc是通过引用计数的方式来控制对象的内存释放,对象被创建,被引用,被拷贝....的时候引用计数+1,当结束使用对象的时候-1,一直减到0,对象就被释放了.引用分为强引用和弱引用.强引用对象不在了,引用也不会消失,对象不会被回收(强引用持有对象).弱引用,引用的对象消失了,那么该引用就会被回收.(弱引用不持有对象)[相当于你拿枪去杀人,强引用是杀完人,人不在了,舍不得扔,还在手里.弱引用是拿枪杀完人,就把枪扔了]循环引用就是敌人也有一把枪指着你(相互引用),你不敢动,敌人也不敢动.你们都不能去干其他活,这就造成社会资源浪费(内存).我们创建OC对象属性的时候一般使用strong(强引用),weak(弱引用),非ARC对应的是retain和assign.weak被释放时会置为空(nil) assign对象会被销毁,但是指针仍然指向原地址(内容已变)关于引用还有一些特殊情况特殊要求催生了一些特定的引用:所有权修饰符__ ,不管是强引用弱引用保留释放,都只在作用域内生效(花括号),出了作用域,对象会被废弃.id类型默认是id __strong objc,.id的指针默认有__autoreleasing.我们调用一个变量的时候就会将该变量放到autoreleasingpool中,当需要销毁的时候,翅中的变量会全部销毁.在main.m中可以看到@autoreleasingpool包含/作用了整个程序.(只说这么多了,其他看的有点乱)
C中的函数对应OC中的是方法.只不过方法是面向对象的,而C是面向过程语言.