变量和数据类型
大部分初始化工作以init开头。
常用重载init函数的“模版”
- (instancetype) init
{
self = [super init];
if (self) {
//init code here
}
return self;
}
注意:super是父类。
返回instancetype,防止子类继承下去,导致init错误。
如重载init,将整型实例变量初始化为0。
Fraction *a = [Fraction alloc] initWith : 10 over: 3];
这样单独添加一个带参数的初始化函数也可以。
init编写时的函数返回值instancetype,这是编写可能会被继承的类init方法的一般规则。
作用域回顾
@synthesize window=_window;
表示合成属性window的取值和设值方法,并将属性与实例变量_window (并未显性声明) 关联起来。
属性:window,实例变量_window.
可以通过self.window来访问。
在类内部也可以使用[_window visible];但不能[window visible];
在实现部分声明实例变量(使用@synthesize指令隐性声明的实例变量)是私有的
无法在子类中使用,但是可以继承父类的存取方法来进行访问。
只要在属性中声明过它们后,编译器即使不用@sythesize指令也会生成这些方法。@property
全局变量
按照惯例,使用小写的g开头。
定义一个全局变量,其它文件也可以访问。外部全局变量。
在需要访问的模块中使用extern进行声明就可以使用。
只允许一处定义,允许多处声明。
声明不会引起变量存储空间分配,而定义会引起变量存储空间的分配。
可以在其它文件中某个函数中单独声明,也可以在文件内统一声明。分需求。
静态变量
外部全局变量+静态变量 = 全局变量。
全局变量会破坏封装,不如封装到某个类中。
使用static将全局变量限制在本文件内。
作用范围:声明后的文件部分。
用途:类方法中可以设定和访问一些变量,使用静态变量非常合适。
尽量不要冲在alloc函数,其中有处理内存的物理分配。可以封装一个allocABCD来用。
+ (Fraction *) allocABCD
{
extern int gCounter;
++gCounter;
return [Fraction alloc];
}
枚举数据类型
enum,跟C语言的类似。
Objective -C 编译器实际上将枚举标识符作为整型常量来处理。
可以明确地给枚举类型的变量赋予一个整数值,应该使用类型转换运算符。
lastMonth = (enum month) (monthValue - 1);
枚举类型提供了一种方法:可以使你能把整型值和有象征意义的名称对应起来。
typedef
跟C语言类似,常和结构体,枚举一起使用。
数据类型转换
转换规则,1. long double,double,float,(Bool、char、short int、bit field或枚举类型 -> int),
long long int , long int, int.
按照这个顺序考虑转换,其中转成int这个动作不能结束,继续执行。其它的转换后即可以结束了。
位运算法。
~,&,|, ^, <<, >>
跟C语言类似。
其中右移:有符号数要注意:符号位为0,则补充0.
符号位为1,补充1的称为算术右移。补充0的称为逻辑右移。常见是算术,不能确保每台机器都是这样。
如果超出了移位限制,结果是未定义的。