1.类的概念
多态:使不同的类能够共享相同的方法名,相同的名称,不同的类。 Objective-C 系统总是跟踪对象所属的类,运行时先判定对象所属的类,再确定需要调用的方法。
1.2 动态类型:程序直到执行时才能确定对象所属的类,id类型。
1.3 动态绑定:程序直到执行时才确定要对对象调用的实际方法。
1.4. 静态变量的优势:
1 ) . 静态形态是因为它能更好地在程序 编译阶段而不是运行时指出错误 。
2).提高程序可读性,程序应该具有自说明性。
2.变量与作用域
2.1. 类的初始化:常见的编程习惯是类中所有初始化方法都以init…开头。如果你的类包含多个初始化方法,其中一个应该是指定的初始化方法,其他所有初始化方法都应该使用这个方法。开始执行程序时,它向所有类发送initialize调用方法,如果存在一个类及相关子类,父类先得到这个消息,该消息向每个类只发送一次,并且在发送其他所哟消息之前发送该消息,这样做可以使程序开始时执行所有类的初始化工作,例如,可能想在开始时初始化与类有关的静态变量。
2.2. 作用域
1)控制实例变量作用域的指令:
@protected---该指令后面的实例变量可被该类及任何子类中定义的方法直接访问,是默认情况。
@private---变量可以被该类的方法直接访问,但不能被子类的方法访问。
@public---变量可被该类方法直接访问,也可被其他类或模块的方法直接访问。
@package---对于64位图像,可以在实现该类的图像的任何地方访问这个实例变量,这不是好的变成习惯,违背了封装的思想。
这些指令的作用范围是,指令处起始到右花括号,或者另外一个命令。
2)外部变量
按照惯例,用小写的g作为全局变量的首字母。
外部变量---可以被其他任何文件的任何方访问或改变。
外部全局变量,在所有类,方法之外定义,只定义一次,声明方法,不加extern,比如 int gFLag。
在其他文件访问时,必须先声明(可声明多次),extern int gFlag;
在一个文件中,只在开始进行一次extern声明将比较简便,在只有少数几个方法使用的时候,也可在各个
方法中声明。若在定义的同一个文件中的方法访问,不用声明。
3)auto
自动局部变量,与static相反,是变量默认存储方式。静态变量有默认初始值0,而自动变量没有默认初始值,除非显示赋值,否则未知。
4)const
制定的变量为只读,在程序运行期间有恒定的值。
5)volatile
防止编译器优化掉看似多余的变量赋值。与const相反,明确告诉编译器,指定变量的值会改变
2.3. 枚举数据类型
枚举类型可以制定特定的值,后面的类型值递增1.
枚举标示符可以共享相同的值enum Boolean {no=0,false=0,yes=1,true=1}
给枚举类型变量赋值超过定义的范围,编译器不报错。
使用包含枚举数据类型的程序时,尽量不要一栏枚举值被当作整数这个事实,相反尽量把它们当作独立的
数据类型。
还可以这样定义枚举变量。
Enum {east,west,south,north} direction;
2.4 typedef
分三步,
1)像声明所需要类型的变量那样编写一天语句。Int n;
2)在通常应该出现声明的变量的地方,将其替换未新的类型。Int NUM
3);在语句的最前面加上关键字typedef
typedef int NUM;
NUM n = 100;
enum (east,west,south,north) direction;
enum (east,west,south,north) DIR;
typedef enum {east,west,south,north} DIR;
DIR direction = east;
2.5 数据类型转换
1)如果其中一个操作数是long double,则另外一个操作数被转换为long double型,计算结果也是这种类型
2)如果其中一个操作数是double型,则了一个操作数转换为double型,计算结果也是这个类型
3)如果其中一个操作数是float型,则另一个操作数转换为float型,计算结果也是这个类型
4)如果其中一个操作数是_Bool,char,short int,bit fiels或枚举数据类型,则全部转换为int 型
5)如果其中一个操作数是long long int型,则另一个操作数转换为long long int计算结果也是这个类型
6)如果其中一个操作数是long int 型,则另一个操作数转换为long int型,计算结果也是这种类型
7)如果到达这一步,则可知两个操作数都是int型,计算结果也是这个类型。
2.6. 符号扩展:只要将有符号的int或short int转换成更多字节的整型,在执行转换过程中给你符号位就会扩展至左侧,这就保证-5的short int转换成long int之后,它的值依然是-5.在intel,arm上,字符是作为有符号的两处理的。。如果要强制对字符便利爱那个进程符号扩展,则可将这些变量声明未signed char型。4
3.分类和协议
3.1如果将分类放到一个主类定义文件中,那么这个类的所有用户豆浆访问这个分类中的方法。
3.2.分类可以访问原始类的实例变量,但不能添加变量(只能创建子类)。
3.3.分类可以重载一个方法,但是最好不要这样做,因为重载之后,原来的方法就不能使用了。(这种情况适合用子类)。
3.4.可以拥有许多分类,如果一个方法定义在多个分类中,该语句不会制定使用那个分类。
3.5.不必实现分类的所有方法。
3.6.通过分类添加新方法扩展类不仅会影响这个类,也会影响所有子类。
3.7.对象/分类命名对必须是唯一的,但是在给定的Objective-C名称空间中,只能存在一个NSString(私有的)分类。
4.协议
5.预处理
5.1.#运算符。
#define str(x) # x
比如str(hello,”world”)—>”hello,\”world\””
参数中的任何双引号或反斜线符号都是预处理程序的保留字符。
5.2.##运算符
##用于把两个标记连在一起,创建单个标记.
#define printx(n) printf(“%i\n”,x ## n)
printx(5)--àprintx(“%i\n”,x5);