您的位置:首页 > 其它

OC基础(19)

2015-12-03 20:16 330 查看
类扩展(Class Extension)

Block基本概念

typedef和Block

Block注意事项

类扩展(Class Extension)

本小节知识点:

【理解】什么是类扩展

【理解】类扩展书写格式

1.什么是类扩展

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

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

写在.m文件中

英文名是Class Extension

2.类扩展书写格式

@interface 类名 ()
@end


> 对比分类, 就少了一个分类名称,因此也有人称它为”匿名分类”

Block基本概念

本小节知识点:

【了解】什么是Block

【理解】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

本小节知识点:

【了解】函数指针回顾

【掌握】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注意事项

本小节知识点:

【掌握】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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: