-
@property int age:
- 生成一个私有属性_age
- 生成_age的setter和getter声明和实现
- 同类型可以批量写
- 需要自定义逻辑验证,就重写。
- setter重写,getter还会自动生成;反之也是。
- setter和getter都重写,不生成属性
-
分类(category):把一个类写成多个分类
- new file -> objective-c文件 -> 取个分类名,选category,class选分类所属的类
- 语法:.h文件类名后面跟(分类名)
- 使用:要把分类的头文件导进来。例如student的分类itcast: #import "student+itcast.h"
- 分类中只能添加方法、不能添加属性
- 分类中可以写@property,但是不会生成属性,不会生成实现,只生成声明
- 分类中不能直接访问真私有属性,但是可以用点语法调setter、getter
- 分类和本类有同名方法时,优先调用分类的,哪怕没有import分类头文件
- 分类中有相同的方法,优先调用最后编译的分类
-
分类的作用:
- 将一个类划分为多个分类
- 为原有的类添加方法
- 为系统类添加方法,叫“非正式协议”
-
延展(extension)
- 是一个特殊的分类,但是与分类有差别
- 写在.m文件里面
- 可以定义属性和方法,只能写方法声明,不能写实现
- @property属性会自动生成setter、getter方法,此时这个属性为真私有属性,setter、getter方法只能在类内访问,因为它的声明在延展里,延展在.m文件里,导入类只能导入.h文件
- 只有实现,没有声明的方法是私有方法,可以把声明写在延展里,一目了然哪些方法是私有的
@interface student ()
...
#end
- block:是一个数据类型
- 存储一段代码,可以有参数和返回值
- 声明一个block变量,需要指定有什么参数和返回值,以后这个block变量只能存这样的代码
- 声明block变量的语法:
- 返回值 (^block名字) (参数列表)
- 例如:int (^myBlock)(int num1, int num2) //创建了一个返回值为int,参数为两个int的block,只能赋值返回值为int,参数为两个int的函数
- 参数名字可以省略
- 代码段语法:
- ^返回值类型 (参数列表){函数体}
- 例如:^int(int num1, int num2){ return num1 + num2};
- 赋值给block
- 先声明再赋值:
- int (^myBlock)(int num1, int num2)
- myBlock = ^int(int num1, int num2){ return num1 + num2};
- 声明的时候赋值:
- int (^myBlock)(int num1, int num2) = ^int(int num1, int num2){ return num1 + num2};
- 调用:就像函数一样调用: myBlock(3, 4)
- block简写:
- 代码段的返回值是void可以省略,block声明不可省略
- 代码段没参数,括号可以省略,block声明不可省略
- block声明中参数名字可以省略
- 无论代码段是否有返回值,返回值类型都可以省略,根据代码段里的return自动确定
- 总结:代码段中可以省略void、没参数时的括号、返回值类型
- typedef :
- typedef 返回值(^block类型名) (参数列表)
- 例如 :typedef void (^blockType1)(int num1, int num2)
- blockType1 myBlock //创建了一个blockType!类型的block变量
- block代码段可以读外部局部变量和全局变量,但是不能修改外部局部变量,若要修改,用__block修饰这个变量
- _Nonnull属性表示该block的返回值肯定不为空(非空)。
params.bundleIdBuilder = ^NSString * _Nonnull{ return @"bundleID"; }; - block变量作为函数参数 void fun()
- 函数参数里面写block变量的声明 void fun( void(^myblock)()) { myBlock()}
- 或者typedef : typedef void(^blockType)(); void fun(blovkType myBlock) {myBlock()}
- 调用
- 传一个block变量
- 直接在函数参数中写block代码段
- block作为类方法参数:block名写在最后: - (void)compare: (int )i withnumber:(int)j compareblock:(void(^)(int a, int b)myBlock;
- 作用:可以把自己写的代码交到函数中调用(类似于函数指针)
- block作为函数返回值,必须用typedef