一.关键字typedef的用法
用typedef来为复杂的声明定义简单的别名
1.使用typedef定义一种类型的别名,而不是简单的宏替换,可以用作同时声明指针类型的多个对象
比如:
char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针,和一个字符变量;
// 以下则可行:
typedef char* PCHAR;
PCHAR pa, pb;
2. 用typedef来定义与平台无关的类型
用typedef来定义与平台无关的类型。比如定义一个叫 REAL 的浮点类型,在目标平台上,让它表示最高精度的类型为:
typedef long double REAL;
在不支持 long double 的平台二上,改为:
typedef double REAL;
在连 double 都不支持的平台三上,改为:
typedef float REAL;
也就是说,当跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改。
二. enum和typedef的区别
1.enum是枚举类型,
如:
enum AlertTableSections
{
kUIAction_Simple_Section = 1,
kUIAction_OKCancel_Section,
kUIAction_Custom_Section,
kUIAlert_Simple_Section,
kUIAlert_OKCancel_Section,
kUIAlert_Custom_Section,
};
kUIAction_OKCancel_Section的值为2.
2 .typedef enum 的使用
typedef
typedef enum {
UIButtonTypeCustom = 0, // no button type
UIButtonTypeRoundedRect, // rounded rect, flat white button, like in address card
UIButtonTypeDetailDisclosure,
UIButtonTypeInfoLight,
UIButtonTypeInfoDark,
UIButtonTypeContactAdd,
} UIButtonType;
UIButtonType表示一个类别,它的值只能是UIButtonTypeCustom....
二 .block的定义
1 // 声明和实现写在一起,就像变量的声明实现 int a = 10;
2 int (^aBlock)(int, int) = ^(int num1, int num2) {
3
4 return num1 * num2;
5
6 };
7 // 声明和实现分开,就像变量先声明后实现 int a;a = 10;
8 int (^cBlock)(int,int);
9 cBlock = ^(int num1,int num2)
10 {
11 return num1 * num2;
12 };
其中,定义了一个名字为aBlock的blocks对象,并携带了相关信息:
1、aBlock 有两个形式参数,分别为int类型;
2、aBlock 的返回值为int 类型;
3、等式右边就是blocks的具体实现;
4、^ 带边blocks声明和实现的标示(关键字);
当然,你可以定义其他形式的block。e.g:无返回值,无形式参数等;
1 void (^bBlock)() = ^()
2 {
3 int a = 10;
4 printf(num = %d,a);
5 };
2、blocks 访问权限
blocks可以访问局部变量,但是不能修改。
1 int a = 10;
2 int (^dBlock)(int) = ^(int num)
3 {
4 a++;//not work!
5 return num * a;
6 };
此处不能修改的原因是在编译期间确定的,编译器编译的时候把a的值复制到block作为一个新变量(假设是a‘ = 10),此时a'和a是没有关系的。
这个地方就是函数中的值传递。如果要修改就要加关键字:__block或者static
1 __block int a = 7;
2 int (^dBlock)(int) = ^(int num)
3 {
4 a++;// work!
5 return num * a;
6 };
3、block的调用
block调用就像调用函数一样。e.g:
1 | int c = aBlock(10,10); |
4、block 应用
假设我们熟悉代理递值的话,对代理我们可能又爱有恨!我们先建立模型A页面 push B页面,如果把A页面的值传递到B页面,属性和单例传值可以搞定!但是如果Pop过程中把B页面的值传递到A页面,那就可以用单例或者代理了!说到代理,我们要先声明协议,创建代理,很是麻烦。常常我们传递一个数值需要在两个页面间写很多代码,这些代码改变页面的整体顺序,可读性也打了折扣。所以,此时,block是一种优化方案!
三.instancetypeinstancetype的作用,就是使那些非关联返回类型的方法返回所在类的类型!
果使用instancetype作为返回类型
@interface NSArray
+ (instancetype)constructAnArray;
@end
当使用相同方式初始化NSArray时:
[NSArray constructAnArray];
得到的返回类型和方法所在类的类型相同,是NSArray*!
instancetype和id的异同
1、相同点
都可以作为方法的返回类型
2、不同点
①instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型的对象;
②instancetype只能作为返回值,不能像id那样作为参数