晚点的等待

博客园 首页 新随笔 联系 订阅 管理

类扩展(Class Extension)

本小节知识点:

  1. 【理解】什么是类扩展
  2. 【理解】类扩展书写格式

1.什么是类扩展

  • 延展类别又称为扩展(Extendsion),Extension是Category的一个特例

  • 可以为某个类扩充一些私有的成员变量和方法

    • 写在.m文件中
    • 英文名是Class Extension

2.类扩展书写格式

@interface 类名 ()
@end
  • > 对比分类, 就少了一个分类名称,因此也有人称它为”匿名分类”

 

Block基本概念

本小节知识点:

  1. 【了解】什么是Block
  2. 【理解】block的格式

1.什么是Block

  • Block是iOS中一种比较特殊的数据类型

  • Block是苹果官方特别推荐使用的数据类型, 应用场景比较广泛

    • 动画
    • 多线程
    • 集合遍历
    • 网络请求回调
  • Block的作用

    • 用来保存某一段代码, 可以在恰当的时间再取出来调用
    • 功能类似于函数和方法

2.block的格式

  • Block的定义格式
返回值类型 (^block变量名)(形参列表) = ^(形参列表) {

};
  • block最简单形式
void (^block名)() = ^{代码块;}

例如:
void (^myBlock)() = ^{ NSLog(@"李南江"); };
  • block带有参数的block的定义和使用
void (^block名称)(参数列表)
= ^ (参数列表) { // 代码实现; }

例如:
void (^myBlock)(int) = ^(int num){ NSLog(@"num = %i", num); };
  • 带有参数和返回值的block
返回类型 (^block名称)(参数列表)
= ^ (参数列表) { // 代码实现; }

例如:
int (^myBlock)(int, int) = ^(int num1, int num2){ return num1 + num2; };
  • 调用Block保存的代码
block变量名(实参);

 

typedef和Block

本小节知识点:

  1. 【了解】函数指针回顾
  2. 【掌握】block和typedef

1.函数指针回顾

  • 函数指针使用
int sum(int value1, int value2)
{
    return value1 + value2;
}

int minus(int value1, int value2)
{
    return value1 - value2;
}

int main(int argc, const char * argv[]) {
    int (*sumP) (int, int) = sum;
    int res = sumP(10, 20);
    NSLog(@"res = %i", res);

    int (*minusP) (int , int) = minus;
    res = minusP(10, 20);
    NSLog(@"res = %i", res);
    return 0;
}
  • 函数指针别名
typedef int (*calculate) (int, int);
int main(int argc, const char * argv[]) {
    calculate sumP = sum;
    int res = sumP(10, 20);
    NSLog(@"res = %i", res);
    calculate minusP = minus;
    res = minusP(10, 20);
    NSLog(@"res = %i", res);
    return 0;
}

2.block和typedef

  • block使用 

  • int main(int argc, const char * argv[]) {

  • int (^sumBlock) (int, int) = ^(int value1, int value2){ return value1 + value2; };

  • int res = sumBlock(10 , 20); NSLog(@"res = %i", res);

    int (^minusBlock) (int, int) = ^(int value1, int value2){ return value1 - value2; };

  • res = minusBlock(10 , 20); NSLog(@"res = %i", res); return 0;

  • }

  • block别名

int main(int argc, const char * argv[]) {
    calculateBlock sumBlock = ^(int value1, int value2){
        return value1 + value2;
    };
    int res = sumBlock(10, 20);
    NSLog(@"res = %i", res);
    calculateBlock minusBlock = ^(int value1, int value2){
        return value1 - value2;
    };
    res = minusBlock(10, 20);
    NSLog(@"res = %i", res);

    return 0;
}

 

Block注意事项

本小节知识点:

  1. 【掌握】Block注意事项

1.Block注意事项

  • 在block内部可以访问block外部的变量
int  a = 10;
void (^myBlock)() = ^{
    NSLog(@"a = %i", a);
    }
myBlock();
输出结果: 10
  • block内部也可以定义和block外部的同名的变量(局部变量),此时局部变量会暂时屏蔽外部
int  a = 10;
void (^myBlock)() = ^{
    int a = 50;
    NSLog(@"a = %i", a);
    }
myBlock();
输出结果: 50
  • 默认情况下, Block内部不能修改外面的局部变量
int b = 5;
void (^myBlock)() = ^{
    b = 20; // 报错
    NSLog(@"b = %i", b);
    };
myBlock();
  • Block内部可以修改使用__block修饰的局部变量
  • objc __block int b = 5;
  • void (^myBlock)() = ^{ b = 20;NSLog(@"b = %i", b); };
  • myBlock();
  • 输出结果: 20
posted on 2015-12-03 20:16  晚点的等待  阅读(165)  评论(0编辑  收藏  举报