9 OC基础加强03
分类(cagetory) 类别,类目 (模块名)关键符号
作用:
- 将一个类分成多个模块,将相似的功能鞋在同一个模块中,以便后期的维护修改.但是要注意引用的是哪个分类文件,只引用本类文件无法调用方法.
- 分类中可以写方法,但是不能写属性(可以写@property,但是不能生成私有属性,不能生成set,get方法的实现,只能生成申明).
- 本类中的真私有属性分类也无法直接访问,可以通过方法的调用(语法)访问.
- 分类可以写同名方法,但是调用时会调用分类中编译顺序中实现的最后编译的方法,如下
例子:给一个人对象的诸多方法进行分类.
非正式协议 ( )
- 和协议无关,只是对Xcode系统自带的类写分类.
例子:为NSString 类写一个统计这个字符对象中数组的个数.
延展,类扩展(extension) ( )关键符号内部不写
意义:为一个类,定义私有化属性和方法,规范:写在该类的.m文件中,并且以前说私有方法直接写类的实现,不写声明改为在延展中写声明,方便直接查看私有方法.
一个特殊的分类,1.延展是一个匿名分类…2.只有声明,与本类共享实现…3,还可以写@property(这个生成的是真私有属性,同时生成set,get方法的声明和实现)
block类型(记得调用,才能实现)
* 存储代码块(有限制的储存),本质是数据类型 *数据类型可以声明变量,作为参数.其实是一个匿名的函数.
- block变量的声明
//这个数据类型很特别,他声明变量名不是在最后,而是写在中间
void (^myblock)(int num1,int num2)
* 变量名为:myblock *
* 类型为:void(^)(int num1,int num2); *
- block变量的赋值
myblock = ^void(int num1,int num2){
num1 = 21;
num2 = 22;
};
- block变量的定义的同时初始化.
void (^myblock)(int num1,int num2) = ^void(int num1,int num2){
NSLog(@"%d---%d",num1,num2);
};
- typedef简化block类型
typedef int arr[3];
//前面的意思是给一个长度为3的int类型数组起名叫做arr,arr是一个类型;
arr arr1--->arr1才是变量名
typedef void (^Myblock)();
* 此时Myblock在这里是给void (^)()类型起了一个Myblock的别名(类型名首字母大写). *
- block代码块内部的全局变量和局部变量
全局变量可以直接修改,局部变量不能修改(加* _ _block *才能修改)
- block中的省略
void (^myblock)(int num1,int num2) = ^void(int num1,int num2){
NSLog(@"%d---%d",num1,num2);
};
声明中参数名可以省略,实现中返回值可以省略(自动判断返回值),实现无参可以省略.
- block作为函数的参数
- block作为方法的参数(调动block)
都是直接把block类型生成一个变量(可以先typedef换别名).
协议(protocol)
内存区域的大概地址(前缀)
桟区:0x7f
堆区;0x00
全局区:0x0000