学习笔记13-OC@category+@block

1 分类(category)

        作用

1)不修改类的源文件 增加方法。

             2)将庞大的类分成若干模块开发

    3)将庞大的类由多人开发

目的

1)    对现有类进行扩展

2)    作为子类的替代手段

3)    对类的方法进行归类

实现

1) 声明分类

格式: @interface 待扩展的类名(分类名称)

            方法声明;

           @end

 

               @interfacePerson(base)

                      方法声明;

            @end

2) 实现分类

格式 :   @implementation 待扩展的类 (分类名称)

       方法的实现;

@end

@implementation Person (base)

       方法的实现;

@end

3) 使用方法和普通方法一样。

 

注意

1) 分类文件的命名:类名+分类名 (Person+base)

2) 只能增加方法,不能增加成员变量。

3) 可以访问原类的成员变量

4) 如果分类中出现和原类同名方法,优先使用分类中的方法。

5) 多个分类中有同名方法,使用最后编译的同名方法。

2 分类与非正式协议

       非正式协议是类别,是NSObject或其子类增加的分类。

3 延展类别(extension)

       延展是分类名为空的分类。(匿名类别)

      为类增加类没有的成员变量 方法或者合成属性

       只有一个单独的头文件。实现是在类的原文件中实现。

1) 声明

格式: @interface 待扩展的类名()

               {

                      成员变量列表

}

            方法声明;

           @end

 

               @interfacePerson()

                      {

                             int  age;

}

                      方法声明;

            @end

 

注意

1) 可以在延展中添加实例变量

2) 不能在用@implementation在延展中实现,只能在原类中实现

3) 方法不能被子类继承。(私有方法)

4) 使得OC中有了相对私有的方法。

4  @block

              对比函数学习

                     定义

                            用^声明block类型

                            int (^myBlock)(int)=^(int num){

             

}

                            第一个int:返回值类型

                            ^myBlock:声明这是一个block类型变量名为myBlock

                            (int) :参数类型

                            (int num):参数类型及参数

                            无参无返回值

                                   void (^myBlock)()=^(){  //没有参数的时候小括号可以省略

                                          代码块语句;

}

 

有参无返回值

                                   void (^myBlock)(int num)=^(int num){    //参数之间用逗号分隔

                                          printf(“%d”,num);

}

                     使用

                                   myBlock();//括号内输入实参。

                     block与typedef

                                   给block起别名

                                   格式 typedef  int (^myBlock)(int);   //类似函数指针

                                   可以用myBlock定义其他返回值 类型相似的blokc

                     block访问外部变量

                            可以访问外部变量。

                            当block访问外部变量的时候会把变量以const形式赋值,存在block所在的内存中(堆区),值不可改变。

                            block内部可以定义变量存在栈区

                            在block内部 __block修饰外部变量 可以对外部变量的值进行修改。

                            内存空间还是在堆区。

                            如果变量是全局变量在block中可以直接修改。

                           

                     block变量作为函数返回值

1) 用typedef 定义block的新类型

2) 用新类型作为函数的返回值类型

3) 用新类型定义变量接收返回值

4) 变量后加()调用返回的block

block使用技巧

       助记符:inLineBlock

                           

                    

 

 

             

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值