oc学习记录2-基本概念

97 阅读3分钟
  • @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