OC-变量和数据类型
对象的初始化
Fraction *myFract=[[Fraction alloc] init];//初始化对象
[myFract setTo:1 over:3];//设置初始值
初始化对象和设置初始值的过程通常可以合并到一个方法中。
myArray=[[NSArray alloc] initWithArray:myOtherArray];
常见的编程习惯类中的所有初始化方法都以init开头。
编写初始化方法的策略:
通过复写init方法达成目的;必须将父类init方法的执行结果赋值给self(因为初始化过程改变了对象在内存中的位置--意味着引用将要改变);如果有多个初始化方法,应把参数最多的初始化方法作为指定的初始化方法,其他的初始化方法调用指定的初始化方法,这样可以把大部分初始化代码集中到单个方法中。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
-(Fraction *)initWith:(int)n over:(int)d { self=[super init]; if (self) { [self setTo:n over:d]; } return self; }
为了符合初始化规则,应该重写Fraction类的init方法,这一点尤其在作为子类时特别重要;所有的初始化方法都应返回id类型,这是编写可能会被继承的类初始化方法的一般规则,因为子类的对象并不等同于父类。
作用域
@protected 可被该类及任何子类中定义的方法直接访问--接口部分定义的实例变量默认是这种作用域
@private 可被定义在该类的方法直接访问,当时不能被子类中定义的方法直接访问--实现部分定义的实例变量默认是这种作用域
@pubilc 可被该类中定义的方法访问,也可被其他类或模块中定义的方法直接访问
@package 对于64位映像,可以在实现该类的映像中的任何地方访问这个实例变量
全局变量
在程序的开始处(所有的方法、类定义和函数定义之外)编写int gMoveNumber=0,那么gMoveNumber即为全局变量,而且是外部全局变量。
惯例,g作为全局变量的首字母
需要访问别的文件中定义的全局变量,只需在声明前加上关键字extern。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#import <Foundation/Foundation.h> #import "Foo.h" int gGlobalVar=5; int main(int argc, const char * argv[]) { @autoreleasepool { Foo *myFoo=[[Foo alloc] init]; NSLog(@"%i",gGlobalVar); [myFoo setgGlobalVar:100]; NSLog(@"%i",gGlobalVar); } return 0; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
-(void) setgGlobalVar:(int) val { extern int gGlobalVar; gGlobalVar=val; }
结果:5
10
静态变量
希望定义的全局变量只在特定的模块(文件)中是全局的,除了特定类中的方法之外没有其他方法需要访问这个特定变量。则该变量需要定义为静态变量。静态变量定义如下:static int gGlobalVar=0
枚举数据类型
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
enum flag{false,true}; enum direction{up,down,left=10,right}; enum {east,west,south,north} direction;
数据类型转换
如果其中一个操作数是long double,另一个操作数被转换为long double型,计算结果也是这种类型
如果其中一个操作数是double,另一个操作数被转换为double型,计算结果也是这种类型
如果其中一个操作数是float,另一个操作数被转换为float型,计算结果也是这种类型
如果其中一个操作数是Bool、char、short int、bit field或者枚举数据类型,全部转换为int型
如果其中一个操作数是long long int,另一个操作数被转换为long long int型,计算结果也是这种类型
如果其中一个操作数是long int,另一个操作数被转换为long int型,计算结果也是这种类型
到这一步,两个都是int,计算结果也为int
但是涉及到unsigned操作数时,转换规则更为复杂
位运算符(暂缓)