ios 开发学习日志 自定义alertView 1

来源:互联网 发布:淘宝图库 编辑:程序博客网 时间:2024/06/06 02:31

 

一.关键字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用来定义一系列宏定义常量区别用,相当于一系列的#define xx xx,当然它后面的标识符也可当作一个类型标识符。

如:

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  enum则是用来定义一个数据类型,那么该类型的变量值只能在enum定义的范围内取。

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:

1int c = aBlock(10,10);
  bBlock();

  4、block 应用

  假设我们熟悉代理递值的话,对代理我们可能又爱有恨!我们先建立模型A页面 push B页面,如果把A页面的值传递到B页面,属性和单例传值可以搞定!但是如果Pop过程中把B页面的值传递到A页面,那就可以用单例或者代理了!说到代理,我们要先声明协议,创建代理,很是麻烦。常常我们传递一个数值需要在两个页面间写很多代码,这些代码改变页面的整体顺序,可读性也打了折扣。所以,此时,block是一种优化方案!

三.instancetype

instancetype的作用,就是使那些非关联返回类型的方法返回所在类的类型

果使用instancetype作为返回类型

@interface NSArray  + (instancetype)constructAnArray;  @end 

当使用相同方式初始化NSArray时:

[NSArray constructAnArray];  

得到的返回类型和方法所在类的类型相同,是NSArray*!


instancetype和id的异同
1、相同点
都可以作为方法的返回类型
2、不同点
①instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型的对象;
②instancetype只能作为返回值,不能像id那样作为参数

0 0
原创粉丝点击