控制器传值
属性传值
回传值
委托代理: 把发送数据的类做成委托类:声明协议,在协议中声明一些方法,给委托类定义一个ID类型,名称为delegate的属性,并采用协议。
在委托类的对应方法中,让代理对象调用协议中某个方法
把接收数据的类做成代理类: 实例化委托类对象,设置委托对象的代理对象为自身,采用协议,并定义协议中的方法
一对一关系
通知
:
接受数据的对象中,做注册通知,并设置通知回调方法
发送数据的类 做发送通知的操作
通知是通过一个字符串名称来确定关联
使用时一定要注意:
注册通知的代码必须先于发送通知的代码执行!
通知的名称必须相同!
一对多
Block
可以截获局部变量的匿名函数叫做Block 也叫做快函数
是IOS4.0后引入,作为C语言的扩展,因为C语言不支持函数匿名,C中必须有函数名称才可以调用
语法: 声明、定义、调用、略
与C语言的区别:
C函数不可以嵌套定义C函数,但是可以在C函数,OC方法/Block函数内嵌套定义Block函数
对于返回值参完全相同的Block函数,可以使用函数名赋值,
对于返回值/参完全相同的Block函数,可以将它做成一种类型,用这种类型可以定义变量,但是对此变量赋值
Block函数可以作为变量,也可以作为OC的属性
内存区域划分:
代码区:代码的二进制数据
数据区:全局变量/常量/静态static变量
堆区:动态申请的内存/C语言中的malloc/C++的new/OC的alloc;
堆区数据需要程序员手动申请,用完后手动释放
C中使用malloc动态申请内存,使用free释放内存
C++使用new动态申请内存,使用delete释放内存
OC使用allocated申请内存,使用release减少引用计数,当计数值为0时系统自动调用dealloc释放内存
如果申请了不释放,会发生内存泄露;
如果释放了再使用,会发生野指针异常,运行直接Crash;
栈区:函数局部变量,代码块局部变量,函数形参
系统自动申请内存使用后,系统自动回收,不需要程序员手动干预
NSString *country =nil;//数据区
int a;//数据区
-(void)test:(NSString *)str{//str 在栈区
NSString *s=@"China";//S在栈区,@“China”是一个字符串常量,在数据区
NSString *s2=[NSString stringWithFormate:@"你好%@",@“china”];//S2在栈区
//[NSString stringWithFormate:@"你好%@",@“china”]在堆区
for(int I=0;i<100;i++){
int temp=2; //都属于代码块,都在栈区;
NSLog(@"%d",temp *i);
}
程序:静止的代码块
进程:正在执行中的代码块,是系统划分资源(内存)的基本单位
线程:进程的执行单元,每个进程中都会自动生成一个主线程,同时进程中还可以开辟多个子线程。
多线程:进程和进程之间使用独立的内存空间,一个进程死掉,对其他进程没有影响
多线程:线程使用父进程的内存空间,但是有自己独立的堆栈空间
一个线程死掉,所有的父线程跟着死掉,其他线程也死掉
iOS实现多线程的方式:
pthread (C函数,不常用)
NSThread:OC 的类
NSOperationQueue:OC的类,线程对列
GCD :Block函数,常用,可以完美的使用IOS的多核,轻量级线程
开辟线程后,注意的事项:UI的刷新/UI的赋值必须回到UI主线程去做!!!